实验的主要内容是将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