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聚类查找图像中最主要的颜色相关推荐

  1. OpenCV演示代码以查找图像中的轮廓(附完整代码)

    OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 #include "opencv2/imgcodecs.hpp&quo ...

  2. 基于Python查找图像中最常见的颜色

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决 ...

  3. 使用Python,OpenCV查找图像中的最亮点

    Python,OpenCV找出图像中的最亮点 1. 原理 2. 优化 3. 效果图 4. 源码 参考 这篇博客将向您展示如何使用Python和OpenCV查找图像中的最亮点,以及应用单行预处理代码-- ...

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

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

  5. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  6. Python+OpenCV:K-Means聚类

    Python+OpenCV:K-Means聚类 目标 Learn to use cv.kmeans() function in OpenCV for data clustering. 理解参数 输入参 ...

  7. 使用Python,OpenCV和Hough圆检测图像中的圆

    使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...

  8. OpenCV k均值聚类kmeans clustering的实例(附完整代码)

    OpenCV k均值聚类kmeans clustering的实例 OpenCV k均值聚类kmeans clustering的实例 OpenCV k均值聚类kmeans clustering的实例 # ...

  9. 基于Python的k均值聚类不同规格的商品名

    基于Python的k均值聚类不同规格的商品名 前言 聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大.以此来区分不同的群体. 本篇讲述使用k均值算法对超市购物记录集中的商品名称进 ...

最新文章

  1. 在Mac OS环境下安装MySQL服务
  2. 2.这就是搜索引擎:核心技术详解 --- 网络爬虫
  3. java集合大家族之Map
  4. 使用odbc连接达梦数据库
  5. 极简 Java 工作流概念入门
  6. 用 Python 分析某医院药品销售案例!
  7. 什么是数据库连接池?为什么使用数据库连接池?数据库连接池工作原理
  8. 超级棒的手机流量管理软件,节约流量有技巧
  9. Android Studio 网络调试
  10. 详解网站源码是什么到底该怎么使用?
  11. es查询简单场景问题小记
  12. 再聊虚拟资源知识付费赚钱
  13. Jquery获取与设置属性
  14. C#调用百度地图API,根据地名获取经纬度geocoding
  15. HTML中的单选按钮实现男女性别选择
  16. 区块链1——区块链基础
  17. 【图结构专题】有向图
  18. 如何使用TeamViewer在局域网内远程连接另一台电脑
  19. Windows: Nvidia GeForce RTX 2080ti显卡驱动安装
  20. 33种经典图表类型总结,轻松玩转数据可视化

热门文章

  1. 汽车车灯灯具系统(下)
  2. 2021年大数据Hadoop(八):HDFS的Shell命令行使用
  3. 2021年大数据常用语言Scala(二十四):函数式编程 过滤  filter
  4. 【其他】将幕布文章OPML转换为Markdown的方法
  5. Python find方法与rfind方法的使用
  6. This version of Android Studio cannot open this project, please retry with Android Studio 3.5 or new
  7. apache thrift分析
  8. android:layout_gravity 和 android:gravity 的区别
  9. maven nexus 3 third party 构件上传
  10. Solr初始化源码分析-Solr初始化与启动