image-compression/compressionRGB.py
2023-12-08 19:50:43 +00:00

123 lines
No EOL
2.8 KiB
Python

# -*- 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")