1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > K means 图片压缩

K means 图片压缩

时间:2023-07-01 18:55:20

相关推荐

K means 图片压缩

k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理。

原理分析

在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * 256 * 256。从网上下了一张经典的图像压缩图片作为处理图片原图如下:

所谓通过k-means压缩图片,其实就是将图片所有的像素点聚为指定k类,然后k-means得到的聚类中心与每个像素点所对应类的记录就成了压缩的结果,实际编程中可以用numpy.save将其存储。

img = np.array(Image.open(file))row = img.shape[0]colum = img.shape[1]point = img.shape[2]pix_num = img.shape[0]*img.shape[1]img = img.reshape(pix_num, point)centroid, clusterAssment = kMeans.kMeans_itnum(img, k, maxiter=maxiter)

这里的kMeans_itum是从《机器学习实战》中稍加修改的函数,使其迭代次数有限,因为如果不设限制,跑图片的kmeans真的很慢,函数具体如下:

def kMeans_itnum(dataSet, k, distMeas=distEclud, createCent=randCent, maxiter=1):m = shape(dataSet)[0]clusterAssment = mat(zeros((m,2)))#create mat to assign data points #to a centroid, also holds SE of each pointcentroids = createCent(dataSet, k)clusterChanged = Trueiternum = 0while iternum < maxiter:clusterChanged = Falsefor i in range(m):#for each data point assign it to the closest centroidminDist = inf; minIndex = -1for j in range(k):distJI = distMeas(centroids[j,:],dataSet[i,:])if distJI < minDist:minDist = distJI; minIndex = jif clusterAssment[i,0] != minIndex: clusterChanged = TrueclusterAssment[i,:] = minIndex,minDist**2# print centroidsfor cent in range(k):#recalculate centroidsptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this clustercentroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean iternum = iternum + 1return centroids, clusterAssment

通过这种方式压缩的图片并不能直接打开,要将其解压缩后查看,具体方法:

c_img = np.zeros((pix_num, point))for i in range(pix_num):c_img[i, :] = centroid[int(clusterAssment[i, 0]), :]c_img = c_img.reshape(row, colum, point)plt.figure('after')plt.imshow(c_img)plt.axis('off')plt.show()

就是将每个点的像素设置成为其对应的中心点。

结果展示

实话说,用这种方式跑图片实在太慢,刚开始参数设置为k=128 maxiter=200也就是其他博客用的参数,但是跑了很久没跑出来,先退而求其次,取k=10, maxiter=10:

即使参数设置的很弱,但是依旧能大致的看出老虎的轮廓与纹路,但是由于迭代次数和类数k设置的太少,效果不是很好。

然后将参数调整为k=20, maxiter=20

色彩稍微丰富了一些,但依旧颜色失真,之后如果有充足时间试一试更大的参数。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。