Python OpenCV应用K均值聚类进行颜色量化
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均值聚类进行颜色量化相关推荐
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- 机器学习算法与Python实践之k均值聚类(k-means)
机器学习算法与Python实践之(五)k均值聚类(k-means) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是 ...
- 机器学习算法与Python实践之 k均值聚类(k-means)
文章来源:http://blog.csdn.net/zouxy09/article/details/17589329 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书 ...
- c语言环境下opencv图像K均值聚类,图像处理中kmeans聚类算法C++实现
对于比 较大的类别,如遥感影像中以像素数目表示的较大 的类别,式(1)可以近似表示为 仃222 n2丁 在遥感分类应用中,一般采用试探性的方法确定 选择训练样本数量,选取规则是每个类别需要的样本 数量 ...
- 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, ...
- Kmeans K均值聚类,OpenCV实现
Clustering 聚类 kmeans k均值聚类 Finds centers of clusters and groups input samples around the clusters. ...
- python机器学习库sklearn——k均值聚类
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 k均值聚类的相关的知识内容可以参考 http://blog.csdn.net/luanpeng825485697/article/de ...
- k均值聚类算法python_K均值和其他聚类算法:Python快速入门
k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...
- 计算机视觉与深度学习 | 使用K均值聚类实现基于颜色的分割(matlab版)
================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...
最新文章
- win下我的windows键失效了
- php 递归合并类 call,PHP多个数组合并(递归的进行)
- Linux 定时执行shell 脚本
- linuxC编程实战 my_server.c例子问题总结
- The Falling Leaves UVA - 699
- 用express搭建网站
- 编译安装mysql 不动了_编译安装MySQL5.6失败的相关问题解决方案
- Python 列表(List) 的三种遍历(序号和值)方法
- js-JavaScript常见的创建对象的几种方式
- 华为电视测试软件,简单便捷!实测教你华为智慧屏怎么样用USB安装APP
- 乾天驭爪——智能空中作业机器人
- appleID有必要开双重认证吗!
- 使用安卓原生系统刷机,修改
- typescript 的认识3
- Mybatis之xml方式(一)
- norflash/nandflash 启动分析
- 什么是CMOS与BIOS?又有什么区别?
- [VB.NET]浅谈MDI窗体的多窗体编程
- Vue导入TradingView(无charting_library.min.js文件的包导入方法)
- 关于“差生”的深度讨论
热门文章
- Tomcat之the jre_home environment variable is not defined correctly this environment variable is need
- 2021年大数据ELK(七):安装Elasticsearch-head插件
- adb.exe: device offline
- C# 视频多人脸识别的实现过程
- 纯CSS制作的图形效果
- ARM Linux 基于S3C2451的AD9833波形发生器/Linux字符驱动的理解
- 集群分发脚本xsync
- 2022-2028年中国汽车雷达行业深度调研及投资前景预测报告
- C++ 笔记(05)— 变量(变量定义、声明、初始化、extern关键字、变量之间转换)
- Python 常见的坑汇总