# -*- coding: utf-8 -*- import matplotlib.pyplot as plt import numpy as np from PIL import Image import PIL #import image imCol = plt.imread("mini.jpg", format=None) imRecons = np.zeros((len(imCol[:,0]), len(imCol[0,:]), 3)) erreur = np.ones((len(imCol[:,0]), len(imCol[0,:]), 3)) imRed = imCol[:,:,0] imGreen = imCol[:,:,1] imBlue = imCol[:,:,2] iterationsGlobales = 30 iterations = 20 #RED # compress FF= [[]]*len(imRed[:,0]) GG= [[]]*len(imRed[0,:]) for x in range(iterationsGlobales): F=np.ones((len(imRed[:,0]), 1)) G=np.ones((len(imRed[0,:]), 1)) for y in range(iterations): F = np.dot(imRed, G) / np.dot(np.transpose(G), G) G = np.dot(np.transpose(imRed), F) / np.dot(np.transpose(F), F) FF = np.append(FF, F, 1) GG = np.append(GG, G, 1) imRed = imRed - np.dot(F,np.transpose(G)) erreur[:,:,0] = imRed - np.dot(FF,np.transpose(GG)) imRecons[:,:,0] = np.dot(FF,np.transpose(GG)) #GREEN # compress FF= [[]]*len(imGreen[:,0]) GG= [[]]*len(imGreen[0,:]) for x in range(iterationsGlobales): F=np.ones((len(imGreen[:,0]), 1)) G=np.ones((len(imGreen[0,:]), 1)) for y in range(iterations): F = np.dot(imGreen, G) / np.dot(np.transpose(G), G) G = np.dot(np.transpose(imGreen), F) / np.dot(np.transpose(F), F) FF = np.append(FF, F, 1) GG = np.append(GG, G, 1) imGreen = imGreen - np.dot(F,np.transpose(G)) erreur[:,:,1] = imGreen - np.dot(FF,np.transpose(GG)) imRecons[:,:,1] = np.dot(FF,np.transpose(GG)) #BLUE # compress FF= [[]]*len(imBlue[:,0]) GG= [[]]*len(imBlue[0,:]) for x in range(iterationsGlobales): F=np.ones((len(imBlue[:,0]), 1)) G=np.ones((len(imBlue[0,:]), 1)) for y in range(iterations): F = np.dot(imBlue, G) / np.dot(np.transpose(G), G) G = np.dot(np.transpose(imBlue), F) / np.dot(np.transpose(F), F) FF = np.append(FF, F, 1) GG = np.append(GG, G, 1) imBlue = imBlue - np.dot(F,np.transpose(G)) erreur[:,:,2] = imBlue - np.dot(FF,np.transpose(GG)) imRecons[:,:,2] = np.dot(FF,np.transpose(GG)) imRecons = imRecons/255 #erreur = erreur/255 #imRecons = np.round(imRecons, 4) # plot plt.figure(dpi=300) plt.subplot(1, 2, 1) plt.axis('off') plt.title("Original", loc='center', pad=None) plt.imshow(imCol, interpolation = "nearest") #plt.subplot(1, 3, 2) #plt.axis('off') #plt.title("Erreur", fontdict=None, loc='center', pad=None) #plt.imshow(erreur, interpolation = "nearest") plt.subplot(1, 2, 2) plt.axis('off') plt.title("Compressed", fontdict=None, loc='center', pad=None) plt.imshow(imRecons, interpolation = "nearest") plt.show() tauxComp = round(100-((len(imCol[:,0])+len(imCol[0,:]))*iterationsGlobales)/((len(imCol[:,0])*len(imCol[0,:])))*100,0) print(tauxComp, "% de compression")