使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色
Python,OpenCV,K-Means聚类查找图像中最主要的颜色
- 1. K-Means是什么?
- 2. 步骤
- 3. 效果图
- 4. 源代码
- 参考
对于肉眼来说,从一幅图中识别出主要颜色很容易。那怎么用算法提取出一幅图像中最主要的颜色呢?
在这篇博客文章中,我将向您展示如何使用OpenCV,Python和K-means对RGB像素强度进行聚类以找到图像中最主要的颜色。
1. K-Means是什么?
- K均值是一种聚类算法,可基于n个数据点生成k个聚类;
- 聚簇数 k 必须提前指定;
- 每个簇的平均值称为其“质心”或“中心”;
- 通常,聚簇数量较少(k <= 5)可获得最佳效果;
- K-Means返回
总体而言,应用k均值会产生原始n个数据点的k个单独的簇。与属于其他群集的数据点相比,特定群集内的数据点被认为彼此“更相似”。
在我们的案例中,我们将对RGB图像的像素强度进行聚类。给定一个MxN大小的图像,因此我们有MxN个像素,每个像素都由三个分量组成:红色,绿色和蓝色。
我们将这些MxN像素视为我们的数据点,并使用k均值对其进行聚类。属于给定群集的像素的颜色将比属于单独群集的像素的颜色更相似。
k均值的一个缺点是,我们需要提前指定要生成的簇数。有一些算法可以自动选择k的最佳值。
2. 步骤
(1)加载图像,BGR转RGB;
(2)K-Means均值对RGB像素进行聚类查找图像中最主要的颜色;
(3)根据K-Means结果归一化计算百分比,按百分比绘制占比及颜色;
3. 效果图
分3个聚簇效果图:
分5个聚簇效果图:
通常,聚簇数量较少(k <= 5)可获得最佳效果;
4. 源代码
# python color_kmeans.py --image images/cactus.jpg --clusters 3
# 导入必要的包
import argparseimport cv2
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeansdef centroid_histogram(clt):# 获取不同聚簇的个数,根据每个聚簇的像素数生成直方图# k均值算法将图像中的每个像素分配给最近的聚类。numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)(hist, _) = np.histogram(clt.labels_, bins=numLabels)# 对直方图进行归一化,使得总和为1hist = hist.astype("float")hist /= hist.sum()# 返回直方图return hist# plot_colors函数需要两个参数:
# hist,它是从centroid_histogram函数生成的直方图;
# centroids,是由k-means算法生成的质心(集群中心)的列表。
def plot_colors(hist, centroids):# 初始化代表相对频率的每种颜色的条形图# 定义了一个300×50像素的矩形,以容纳图像中最主要的颜色bar = np.zeros((50, 300, 3), dtype="uint8")startX = 0# 遍历每一个聚簇的百分比及颜色for (percent, color) in zip(hist, centroids):# 绘制每一聚簇的相对百分比endX = startX + (percent * 300)cv2.rectangle(bar, (int(startX), 0), (int(endX), 50),color.astype("uint8").tolist(), -1)startX = endX# 返回条形图return bar# 构建命令行参数和解析
# --image 原始图像路径
# --clusters 期望生成的簇数
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())# 加载图像,转换BGR-->RGB 以在matplotlib展示
image = cv2.imread(args["image"])
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 展示图像
plt.figure()
plt.axis("off")
plt.imshow(image)# 将NumPy数组重塑为RGB像素列表
image = image.reshape((image.shape[0] * image.shape[1], 3))# 使用scikit-learn中的K-means实现来避免重新实现该算法
# 使用K-means查找图像中最主要的颜色
# 使用期望获取的聚簇数,初始化局KMeans类,调用fit()方法将像素列表聚集在一起
clt = KMeans(n_clusters=args["clusters"])
clt.fit(image)# 构建聚簇直方图
# 建立图表以代表每一种颜色所对应的像素数
hist = centroid_histogram(clt)
bar = plot_colors(hist, clt.cluster_centers_)# 展示颜色条形图
plt.figure()
plt.axis("off")
plt.imshow(bar)
plt.show()
参考
https://www.pyimagesearch.com/2014/05/26/opencv-python-k-means-color-clustering/
使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色相关推荐
- OpenCV演示代码以查找图像中的轮廓(附完整代码)
OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 #include "opencv2/imgcodecs.hpp&quo ...
- 基于Python查找图像中最常见的颜色
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决 ...
- 使用Python,OpenCV查找图像中的最亮点
Python,OpenCV找出图像中的最亮点 1. 原理 2. 优化 3. 效果图 4. 源码 参考 这篇博客将向您展示如何使用Python和OpenCV查找图像中的最亮点,以及应用单行预处理代码-- ...
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- OpenCV官方文档 理解k - means聚类
理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...
- Python+OpenCV:K-Means聚类
Python+OpenCV:K-Means聚类 目标 Learn to use cv.kmeans() function in OpenCV for data clustering. 理解参数 输入参 ...
- 使用Python,OpenCV和Hough圆检测图像中的圆
使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...
- OpenCV k均值聚类kmeans clustering的实例(附完整代码)
OpenCV k均值聚类kmeans clustering的实例 OpenCV k均值聚类kmeans clustering的实例 OpenCV k均值聚类kmeans clustering的实例 # ...
- 基于Python的k均值聚类不同规格的商品名
基于Python的k均值聚类不同规格的商品名 前言 聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大.以此来区分不同的群体. 本篇讲述使用k均值算法对超市购物记录集中的商品名称进 ...
最新文章
- 在Mac OS环境下安装MySQL服务
- 2.这就是搜索引擎:核心技术详解 --- 网络爬虫
- java集合大家族之Map
- 使用odbc连接达梦数据库
- 极简 Java 工作流概念入门
- 用 Python 分析某医院药品销售案例!
- 什么是数据库连接池?为什么使用数据库连接池?数据库连接池工作原理
- 超级棒的手机流量管理软件,节约流量有技巧
- Android Studio 网络调试
- 详解网站源码是什么到底该怎么使用?
- es查询简单场景问题小记
- 再聊虚拟资源知识付费赚钱
- Jquery获取与设置属性
- C#调用百度地图API,根据地名获取经纬度geocoding
- HTML中的单选按钮实现男女性别选择
- 区块链1——区块链基础
- 【图结构专题】有向图
- 如何使用TeamViewer在局域网内远程连接另一台电脑
- Windows: Nvidia GeForce RTX 2080ti显卡驱动安装
- 33种经典图表类型总结,轻松玩转数据可视化
热门文章
- 汽车车灯灯具系统(下)
- 2021年大数据Hadoop(八):HDFS的Shell命令行使用
- 2021年大数据常用语言Scala(二十四):函数式编程 过滤 filter
- 【其他】将幕布文章OPML转换为Markdown的方法
- Python find方法与rfind方法的使用
- This version of Android Studio cannot open this project, please retry with Android Studio 3.5 or new
- apache thrift分析
- android:layout_gravity 和 android:gravity 的区别
- maven nexus 3 third party 构件上传
- Solr初始化源码分析-Solr初始化与启动