diff --git a/compressionRGB.py b/compressionRGB.py index c08c658..ba3863d 100644 --- a/compressionRGB.py +++ b/compressionRGB.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- import matplotlib.pyplot as plt -import numpy as np -from PIL import Image -import PIL +import numpy as np #import image @@ -10,114 +8,65 @@ 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 = 10 +iterations = 10 -iterationsGlobales = 30 -iterations = 20 +imRecons[:,:,:] = imCol[:,:,:] -#RED +# Compress all channels one by one -# 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) +for channel in range(len(imCol[0,0,:])): # for each color channel of original image + FF= [[]]*len(imCol[:,:,channel]) # all channels should have the same dimsneions but eh + GG= [[]]*len(imCol[0,:,channel]) + for x in range(iterationsGlobales): + F=np.ones((len(imRecons[:,0,channel]), 1)) + G=np.ones((len(imRecons[0,:,channel]), 1)) + for y in range(iterations): + F = np.dot(imRecons[:,:,channel], G) / np.dot(np.transpose(G), G) + G = np.dot(np.transpose(imRecons[:,:,channel]), F) / np.dot(np.transpose(F), F) + FF = np.append(FF, F, 1) + GG = np.append(GG, G, 1) + + imRecons[:,:,channel] = imRecons[:,:,channel] - np.dot(F,np.transpose(G)) - 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 + erreur[:,:,channel] = imRecons[:,:,channel] - np.dot(FF,np.transpose(GG)) + imRecons[:,:,channel] = np.dot(FF,np.transpose(GG)) -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 +#why does imRecons not fall into the 255 range ? +# why does plt need it to be between 0 and 1 where imCol is fine being 0 to 255 ? because it's not an int ? +print(np.max(imRecons)) +imRecons = imRecons/np.max(imRecons) #erreur = erreur/255 -#imRecons = np.round(imRecons, 4) + +#compression rate +tauxComp = round(100-((len(imCol[:,0])+len(imCol[0,:]))*iterationsGlobales)/((len(imCol[:,0])*len(imCol[0,:])))*100,0) +print(tauxComp, "% de compression") # plot plt.figure(dpi=300) -plt.subplot(1, 2, 1) +plt.subplot(1, 3, 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.subplot(1, 3, 2) plt.axis('off') -plt.title("Compressed", fontdict=None, loc='center', pad=None) +plt.title("Error", fontdict=None, loc='center', pad=None) +plt.imshow(erreur, interpolation = "nearest") + + + +plt.subplot(1, 3, 3) +plt.axis('off') +plt.title("Compressed "+ str(tauxComp) +"%", 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") \ No newline at end of file diff --git a/example.png b/example.png index 559a513..c42a088 100644 Binary files a/example.png and b/example.png differ diff --git a/readme.md b/readme.md index 9e6159c..384504b 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,8 @@ # Compression d'image -Exercice de compression d'image pour apprendre le concept de base et constater le gain en taille de fichier +Simple compression study in both RGB and monochrome images. + +Takes an image as input and generates a plot with a comparison of the original, error, and compressed image, as well as the space saved compared to the raw image data ## Example with 30 & 20 as parameters - \ No newline at end of file +