K-means 寻找图像主体颜色

举报
技术火炬手 发表于 2019/08/09 14:30:17 2019/08/09
【摘要】 几个月前,我写了篇文章“纯python编写K-means算法,提取图片中的主体颜色”,找到图片中的显著颜色。今天突发奇想,能不能把k-means用于图片压缩呢?对图像rgb三个通道进行聚类,得到中心点像素,并填充对应的类别区域,我找来了一张上海的图片进行压缩。

几个月前,我写了篇文章“纯python编写K-means算法,提取图片中的主体颜色”,找到图片中的显著颜色。

今天突发奇想,能不能把k-means用于图片压缩呢?对图像rgb三个通道进行聚类,得到中心点像素,并填充对应的类别区域,我找来了一张上海的图片进行压缩。

上海-768x965.jpg

我的代码如下,由于在jupyte编辑器上写的代码,因此显示图片使用的matplotlib模块

numpy np
matplotlib.pyplot plt
skimage io
cv2 cv
os
sklearn.cluster KMeans

img = io.imread()
img = np.array(img=np.float64) / plt.axis()
plt.imshow(img)

outImgPath = os.path.exists(outImgPath):
    os.makedirs(outImgPath)

(imgk):
    whc = img.shape
    dd = np.reshape(img(w * hc))
    km = KMeans(=k)
    km.fit(dd)
    labels = km.predict(dd)
    centers = km.cluster_centers_
    new_img = img.copy()
    i (w):
        j (h):
            ij = i * h + j
            new_img[i][j] = centers[labels[ij]]
    {: new_img: centers}


plt.figure(=())
plt.imshow(d)
plt.axis()
plt.show()
i ():
    (i)
    out = KMeansImage(=img=i)
    centersnew_image = out[]out[]
    (new_image.shape)
    plt.figure(=())
    plt.imshow([centers]);
    plt.axis()
    plt.show()

        result = []
    result_width =     result_height_per_center =     center_index (i):
        result.append(np.full((result_width * result_height_per_centercenters.shape[])centers[center_index] * =))
    result = np.array(result)
    result = result.reshape((result_height_per_center * iresult_widthcenters.shape[]))

        imgName = % i
    cv.imwrite(os.path.join(outImgPathimgName)result)

    plt.figure(=())
    plt.imshow(new_image)
    plt.axis()
    plt.show()
    imgName = % i
    cv.imwrite(os.path.join(outImgPathimgName)new_image * )

分割线动图.gif

我们看一下生成的图片合成的gif吧~


上海-obmb6s9pu6q4psfyhejs1kgcogszqpfnety9cs0xw6.jpg                                      kmeansGif.gif

当k为2时

分割线动图.gif

block-2.jpg        outputImg-2-768x965.jpg

当k为3时

分割线动图.gif

block-3.jpg         outputImg-3-768x965.jpg

当k为4时

block-4.jpg        outputImg-4-768x965.jpg

当k为5时

block-5.jpg    outputImg-5-768x965.jpg

当k为11时

block-11.jpg    outputImg-11-768x965.jpg

当k为21时

block-21.jpg outputImg-21-768x965.jpg

当k为51时

block-51.jpg  outputImg-51-768x965.jpg

当k为101时

block-101.jpg outputImg-101-768x965.jpg

当k为200时

block-200.jpg   outputImg-200-768x965.jpg

观察上面的图片,可以看到,当K值增大的时候,图片的色彩会更加丰富,画面变得更加细腻。

这种方法比较简单,但也有弊端,kmeans的运算速度实在是太慢了,在高分辨率图片下,计算时间过长。

分割线动图.gif

本文来自Monk

原文链接:http://www.siyuanblog.com/?p=101593


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。