Python OpenCV应用K均值聚类进行颜色量化

  • 1. 效果图
  • 2. 颜色量化是什么?
  • 3. MiniBatchKMeans & KMeans
  • 4. 源码
  • 参考

在这篇博客文章中,我将向您展示如何使用K-means聚类和颜色量化在图像中创建“ A Scanner Darkly”效果。

1. 效果图

左侧原始图像,右侧颜色量化图像

可以看到 k= 12 基本可以跟原始图像一致;

随着量化聚类数量的增加,我们能够更好地模仿原始色彩空间。

在聚簇数和量化图像的质量之间存在明显的权衡。类似于时间换空间,空间换时间;
(1)随着聚簇数量的增加,执行聚簇所需的时间也随之增加。
(2)随着聚簇数量的增加,存储输出图像所需的内存量也随之增加。但是,在两种情况下,由于您使用的调色板要小得多,因此内存占用量仍将小于原始图像。

2. 颜色量化是什么?

颜色量化(Color Quantization)是减少图像中不同颜色数量的过程。通常,目的是尽可能保留图像的颜色外观,同时减少颜色数量,无论是用于内存限制还是压缩。

在我自己的工作中,我发现在构建基于内容的图像检索(CBIR)系统,即“图像搜索引擎”时,最好使用色彩量化。

任何给定的24位RGB图像都有256 x 256 x 256种可能的颜色,我们可以基于这些强度值构建标准的颜色直方图;也可以显式量化图像并减少颜色的数量,例如16或64。这会产生明显较小的空间,并且会减少噪声和差异。

我们可以使用颜色量化构造更严格的颜色直方图,也可以利用二次距离中的量化颜色直方图来计算相似度。

3. MiniBatchKMeans & KMeans

MiniBatchKMeans的速度明显快于普通K均值,尽管质心可能不那么稳定。这是因为MiniBatchKMeans在数据集的较小“批次”上进行操作,而K-Means在数据集的总体上进行操作,因此使每个质心以及质心更新循环的平均值计算要慢得多。

通常,可以从MiniBatchKMeans开始,如果(且仅当)结果不佳时,再切换到普通K-Means。

4. 源码

# USAGE
# python quant.py --image images/cactus.jpg --clusters 10import argparse  # 命令行参数解析import cv2
# 导入必要的类
from sklearn.cluster import MiniBatchKMeans  # K-Means实现def show_image(title, image, width=300):# resize图像以使得图像具有固定的大小,以便整个屏幕都可以展示r = width / float(image.shape[1])dim = (width, int(image.shape[0] * r))resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)# 展示缩放后的图像cv2.imshow(title, resized)# 构建命令行参数及解析
# --image 原始图像
# --cluster 输出图像将要具有的颜色数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
ap.add_argument("-c", "--clusters", required=True, type=int,help="# of clusters")
args = vars(ap.parse_args())# 加载图像获取宽度和高度
image = cv2.imread(args["image"])
(h, w) = image.shape[:2]# 转换图像空间 BGR--> LAB颜色空间
# 为什么转换呢? 因为在L * a * b 颜色空间中,颜色之间的欧几里德距离具有实际的感知意义-RGB颜色空间不是这种情况
# 鉴于k均值聚类也假设了一个欧式空间,因此最好使用L * a * b *而不是RGB;
image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)# 为了聚类像素强度,reshape图像为(M*N,3)特征向量
image = image.reshape((image.shape[0] * image.shape[1], 3))# 根据预先设置的期望颜色数,应用MiniBatchKMeans算法聚类
# 真正执行聚类操作
# 基于预测结果来生成量化图像
clt = MiniBatchKMeans(n_clusters=args["clusters"])
labels = clt.fit_predict(image)
quant = clt.cluster_centers_.astype("uint8")[labels]# 将特征向量重塑为图像
quant = quant.reshape((h, w, 3))
image = image.reshape((h, w, 3))# 转换颜色空间 L*a*b* ---> RGB
quant = cv2.cvtColor(quant, cv2.COLOR_LAB2BGR)
image = cv2.cvtColor(image, cv2.COLOR_LAB2BGR)# 展示图像
show_image("origin", image, 300)
show_image("quant", quant, 300)
cv2.waitKey(0)

参考

  • https://www.pyimagesearch.com/2014/07/07/color-quantization-opencv-using-k-means-clustering/

Python OpenCV应用K均值聚类进行颜色量化相关推荐

  1. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  2. 机器学习算法与Python实践之k均值聚类(k-means)

    机器学习算法与Python实践之(五)k均值聚类(k-means) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是 ...

  3. 机器学习算法与Python实践之 k均值聚类(k-means)

    文章来源:http://blog.csdn.net/zouxy09/article/details/17589329 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书 ...

  4. c语言环境下opencv图像K均值聚类,图像处理中kmeans聚类算法C++实现

    对于比 较大的类别,如遥感影像中以像素数目表示的较大 的类别,式(1)可以近似表示为 仃222 n2丁 在遥感分类应用中,一般采用试探性的方法确定 选择训练样本数量,选取规则是每个类别需要的样本 数量 ...

  5. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  6. Kmeans K均值聚类,OpenCV实现

    Clustering 聚类 kmeans  k均值聚类 Finds centers of clusters and groups input samples around the clusters. ...

  7. python机器学习库sklearn——k均值聚类

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 k均值聚类的相关的知识内容可以参考 http://blog.csdn.net/luanpeng825485697/article/de ...

  8. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  9. 计算机视觉与深度学习 | 使用K均值聚类实现基于颜色的分割(matlab版)

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

最新文章

  1. win下我的windows键失效了
  2. php 递归合并类 call,PHP多个数组合并(递归的进行)
  3. Linux 定时执行shell 脚本
  4. linuxC编程实战 my_server.c例子问题总结
  5. The Falling Leaves UVA - 699
  6. 用express搭建网站
  7. 编译安装mysql 不动了_编译安装MySQL5.6失败的相关问题解决方案
  8. Python 列表(List) 的三种遍历(序号和值)方法
  9. js-JavaScript常见的创建对象的几种方式
  10. 华为电视测试软件,简单便捷!实测教你华为智慧屏怎么样用USB安装APP
  11. 乾天驭爪——智能空中作业机器人
  12. appleID有必要开双重认证吗!
  13. 使用安卓原生系统刷机,修改
  14. typescript 的认识3
  15. Mybatis之xml方式(一)
  16. norflash/nandflash 启动分析
  17. 什么是CMOS与BIOS?又有什么区别?
  18. [VB.NET]浅谈MDI窗体的多窗体编程
  19. Vue导入TradingView(无charting_library.min.js文件的包导入方法)
  20. 关于“差生”的深度讨论

热门文章

  1. Tomcat之the jre_home environment variable is not defined correctly this environment variable is need
  2. 2021年大数据ELK(七):安装Elasticsearch-head插件
  3. adb.exe: device offline
  4. C# 视频多人脸识别的实现过程
  5. 纯CSS制作的图形效果
  6. ARM Linux 基于S3C2451的AD9833波形发生器/Linux字符驱动的理解
  7. 集群分发脚本xsync
  8. 2022-2028年中国汽车雷达行业深度调研及投资前景预测报告
  9. C++ 笔记(05)— 变量(变量定义、声明、初始化、extern关键字、变量之间转换)
  10. Python 常见的坑汇总