添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

基于python+opencv的彩色图片主色提取——利用K-means聚类算法

一、K-means聚类算法

常用的背景主色提取方法有两种: 颜色直方图法和聚类分析法. 一般来说, 背景图像中包含巨大的颜色数目,且各颜色分量之间无显著相关性,通过颜色直方图很难快速而准确地提取背景主色. 而采用基于模糊理论的聚类分析, 利用颜色空间本身是建立在人对颜色的主观感觉基础之上, 且颜色归属的模糊性已经隐藏于颜色的量化过程中的这一特点, 可以快速而准确地提取复杂颜色空间的背景主色。

1.K-means算法原理

K-means 聚类分析的基本思路是: 要对类内颜色的每个像素点与其对应聚类中心的距离平方之和求最小, 即
k-means

式中,n 代表背景图片中一个像素的坐标,C(n) 代表该像素的颜色值,N 代表背景颜色数据样本,K 代表颜色分类数。k 代表每类颜色的聚类中心. rnk 为二分量,代表当前颜色是否属于第 k 类颜色:若 rnk=0,表示当前颜色不属于第 k 类;若 rnk = 1,表示当前颜色属于第 k 类。少数 K-means 聚类分析得到的可能是局部最优值,而不是迷彩设计所需的全局最优值. 为了克服这一缺陷,需要对背景图进行多次 Kmeans 聚类分析,以求得到的最优聚类中心为背景优势色。

2. K-means聚类算法流程

K-Means聚类算法的原理流程:

第一步:确定K值,聚类成K个类簇。
第二步:从数据中随机选择(或按照某种方式)K个数据点作为初始分类的中心。
第三步:分别计算数据中每个点到每个中心的距离,将每个点划分到离中心最近的类中
第四步:当每个中心都划分了一些点后,去每个类的均值,选出新的中心。
第五步:比较新的中心和之前的中心,如果新的中心和之前的中心之间的距离小于某阈值,或迭代次数超过某阈值,认为聚类已经收敛,终止。
第六步:否则继续迭代执行第三到五步,直到第五步满足。

3.sklearn库中sklearn.cluster.KMeans函数参数介绍

sklearn.cluster.KMeans(n_clusters=8, init=‘k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=‘deprecated’, verbose=0, random_state=None, copy_x=True, n_jobs=‘deprecated’, algorithm=‘auto’)

n_clusters :整形,缺省值=8 ,生成的聚类数,即产生的质心(centroids)数。
init :有三个可选值:’k-means++’, ‘random’,或者传递一个ndarray向量。此参数指定初始化方法,默认值为 ‘k-means++’。
(1)‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛(即上文中的k-means++介绍)
(2)‘random’ 随机从训练数据中选取初始质心。
(3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
n_init :整形,缺省值=10,用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
max_iter :整形,缺省值=300,执行一次k-means算法所进行的最大迭代数。
tol :float形,默认值= 1e-4 与inertia结合来确定收敛条件。
precompute_distances :三个可选值,‘auto’,True 或者 False。预计算距离,计算速度更快但占用更多内存。
(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.
(2)True:总是预先计算距离。
(3)False:永远不预先计算距离。
verbose :整形,默认值= 0,详细模式
random_state :整形或 numpy.RandomState 类型,可选用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
copy_x :布尔型,默认值=True,当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。
n_jobs :整形数。指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。
(1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
(2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。
algorithm :三个值可选,“auto”, “full”, “elkan”, 默认为default=“auto”,表示使用K-means算法。“full”表示经典的EM-style算法。“elkan ”通过使用三角形不等式,对具有明确定义的簇的数据更有效。但是由于要分配一个额外的形状数组(n_samples, n_clusters),它的内存消耗更大。

二、python算法实现

第一步,在IDE中导入需要的库:

import cv2
import numpy as np
from skimage import io
from sklearn.cluster import KMeans

第二步,因为要用到fit(X[, y, sample_weight])来计算k-means聚类,所以读取图片后需要转换数据维度:

img=cv2.imread(r"C:\Users\Administrator\Desktop\color restoration\cao2.jpg")
# 转换数据维度
img1 = img.reshape((img.shape[0] * img.shape[1], img.shape[2]))

读取的图片如下所示,我们要提取的就是该图片中的主色。
原始图像

第三步,K-means聚类

#聚类个数
k = 3
#构造聚类器
estimator = KMeans(n_clusters=k, max_iter=4000, init='k-means++', n_init=50)
estimator.fit(img1)
#获取聚类中心
centroids = estimator.cluster_centers_  

其中的聚类个数和其他参数都可以根据实际情况进行调整。

第四步,主色可视化

# 使用算法跑出的中心点,生成一个矩阵,为数据可视化做准备
result = []
result_width = 200
result_height_per_center = 80
# 获取图片色彩层数
n_channels = img1.shape[1]
for center_index in range(k):
    result.append(np.full((result_width * result_height_per_center, n_channels), centroids[center_index], dtype=int))
result = np.array(result)
result = result.reshape((result_height_per_center * k, result_width, n_channels))
result=result.astype(np.uint8)
cv2.imshow('maincolor',result)
# 保存图片
io.imsave(r'C:\Users\Administrator\Desktop\color restoration\color\maincolor.jpg', result)

将提取的3个主色分别显示在80*200的长方形中,并将图片保存下来。最后提取的图片主色如下图:
提取的主色

https://blog.csdn.net/github_39261590/article/details/76910689
https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#examples-using-sklearn-cluster-kmeans

基于python+opencv的彩色图片主色提取——利用Kmeans聚类算法一、Kmeans聚类算法1.Kmeans算法原理2. Kmeans聚类算法流程3.sklearn库中Kmeans函数详解一、Kmeans聚类算法常用的背景主色提取方法有两种: 颜色直方图法和聚类分析法. 一般来说, 背景图像中包含巨大的颜色数目,且各颜色分量之间无显著相关性,通过颜色直方图很难快速而准确地提取背景主色. 而采用基于模糊理论的聚类分析, 利用颜色空间本身是建立在人对颜色的主观感觉基础之上, 且颜色归属的模糊性已经
该程序利用OpenCV中的K均值聚类函数Kmeans2对图像进行颜色聚类,达到分割的目的。 编写此函数的目的是:Kmeans2函数的用法有些难掌握,参考资料少,尤其是对图像进行操作的例子少,我找了很久也找不到, 找到的例子也运行不了,今天终于自己搞定了,想给大家分享一下,供大家参考,节省大家利用Kmeans2进行图像方面开发的时间 ,少走一些弯路。 本例子对印章图像sample.bmp进行颜色聚类 运行此程序一定要配置好OpenCv环境啊!!!
文章目录提取主色1. RGB Or HSV2. KMeans 自适应3. 整体过程及代码4. 结果后续 提取主色 最近有个小任务,需要提取图片中的主色块。最基本的做法就是聚类主色,但是目前需要自适应提取,也就是说需要对于不同的图片提取出不同的主色块数量。 1. RGB Or HSV 貌似大多数提取主色都是建立在RGB色彩空间中,但是就人眼感知而言对红色不太敏感而对蓝色较为敏感;而且,RGB色彩空间是利用三个颜色分量的线性组合来表示颜色相关性很高,所以RGB是一种不均匀的颜色空间。 再来看看HSV,对于单
如何使用OpenCV,Pythonk-means聚类算法来查找图像中最主要的颜色   该任务可用于分析一张优秀摄影作品的色彩分布,并建立色卡图,将其用于本地调色。 K-Means聚类,那么k-means究竟是什么意思呢?   K-means是一种聚类算法。目标是将n个数据点分成k个簇。 n个数据点中的每一个都将被分配给具有最接近平均值的簇。每个簇的平均值称为“质心”或“中心”。   总的来说,应...
import numpy as np from scipy.cluster.vq import vq, kmeans, whiten import matplotlib.pyplot as plt fe = np.array([[1.9,2.0], [1.7,2.5], [1.6,3.1], [0.1,0.1],
图像主色(dominant color)的提取方法有很多种,这里写的主要是量化的方法 直接描述颜色特征。维度将非常多,尤其是真彩色。因此,直接描述颜色特征。维度将非常多,尤其是真彩色。因此, 需要将HSV 空间量化来减少计算量。一种非等间隔的HSV 空 间量化算法显示如下: %图像主色提取-量化 OrImage=imread('7.bmp'); hsv_image=rgb2hsv(Or
1 图像分割 1、图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域提取出来用于不同的研究。 2、图像分割技术已在实际生活中得到广泛的应用。例如:在机车检验领域,可以应用到轮毂裂纹图像的分割,及时发现裂纹,保证行车安全;在生物医学工程方面,对肝脏CT图像进行分割,为临床治疗和病理学研究提供帮助。 2 图像分割常用方法 1.阈值分割:对图像灰度值进行度量,设置不同类别
颜色是一张图像最具代表性的特征,那么如何去对一张图像进行主颜色提取呢?这是今天所要解决的问题。 通过查阅相关资料发现,最常使用的主颜色提取方法是利用Kmeans聚类的方法进行颜色提取。 颜色提取方法流程: