實驗的主要內容是將truecolor的圖片經過一個優化算法獲得其256色的最優表示。本實驗採用kmean作算法對像素的色彩進行聚類的計算,分類獲得一個色彩數爲256的CodeBook,和一個包含有CodeBook索引的矩陣,原圖片的顏色值都從CodeBook中獲取,colorMap矩陣保存其中像素顏色的索引值,這樣經過索引恢復出一個近似的圖片文件,達到比傳統的GIF圖像更好的效果。python
由上圖可見,256色的GIF圖像有明顯的顆粒感,這是由於圖像髮色數太低形成的顏色不連貫。算法
上圖是經過優化算法計算的256色的圖片,從圖片上能夠看出,顏色過渡平滑,幾乎看不出顆粒感,相較於256色的GIF圖像有明顯的優點。app
從圖片上能夠很好的看出,GIF採用的ColorMap對圖像有明顯的失真,細節圖中顆粒感明顯,對比採用優化算法的細節圖,一樣是256色,優化算法處理以後的圖片能夠和採用24bitTrueColor的JPG圖片相媲美,從圖像中幾乎看不出失真。優化
源代碼:code
main.py索引
from colorMap import * fileName='lena.jpg' clusterNum=256 codeBook,colorMap=kmeansImg(fileName,clusterNum) rimg=recoveryImg(codeBook,colorMap) cv2.imwrite('./r.jpg',rimg) cv2.imshow('rimg',rimg) img=cv2.imread('lena.jpg') cv2.imshow('img',img) cv2.waitKey()
from scipy.cluster.vq import * from numpy import * import cv2 def kmeansImg(fileName,clusterNum): img=cv2.imread(fileName) rl=img.shape[0] cl=img.shape[1] img=reshape(img,(img.shape[0]*img.shape[1],img.shape[2])) codeBook,dis1=kmeans(img,clusterNum) colorMap,dis2=vq(img,codeBook) colorMap=reshape(colorMap,(rl,cl)) return codeBook,colorMap def recoveryImg(codeBook,colorMap): img=[] for r in range(colorMap.shape[0]): for l in range(colorMap.shape[1]): img.append(list(codeBook[colorMap[r,l]])) img=array(img) img=reshape(img,(colorMap.shape[0],colorMap.shape[1],3)) return img