如何使用OpenCV,Python和k-means聚类算法来查找图像中最主要的颜色

  该任务可用于分析一张优秀摄影作品的色彩分布,并建立色卡图,将其用于本地调色。
K-Means聚类,那么k-means究竟是什么意思呢?
  K-means是一种聚类算法。目标是将n个数据点分成k个簇。 n个数据点中的每一个都将被分配给具有最接近平均值的簇。每个簇的平均值称为“质心”或“中心”。
  总的来说,应用k均值产生原始n个数据点的k个单独的簇。特定集群内的数据点被认为与属于其他集群的数据点彼此“更相似”。
  在我们的任务中,我们将聚类RGB图像的像素强度。给定MxN大小的图像,我们因此具有MxN个像素,每个像素由三个分量组成:红色,绿色和蓝色。我们将这些MxN像素视为我们的数据点,并使用k-means对它们进行聚类。
  k-means的一个条件是我们需要指定我们想要提前生成的集群数量,有些算法会自动选择k的最佳值,但在这里不做讨论。
具体的效果如下图所示:

代码如下所示,需要指定图像位置与聚类类别数目:

#coding:utf-8
#*********************************************************************************************************
'''
说明:利用python/k-means聚类提取图像中的主要色彩,并建立色彩,可用于摄影调色中的图像色彩分析
算法思路:1)加载RGB图像,并转换为Kmeans可聚类的数据形式;2)设置聚类中心数目,采用Kmeans聚类;3)设置色卡图像,显示聚类结果
具体参数:图像resize到(640, 640*ratio),clusters=4
'''
import cv2
import numpy as np
import argparse
from sklearn.cluster import KMeans
import matplotlib.pyplot as pltap = 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())if __name__ == '__main__':print( '[INFO] 读取图像......' )img = cv2.imread( args[ 'image' ] )if ( img is None ):print( ' Not read img. ' )#获取初始图像的宽高比例,以便resize不改变图像比例ratio = img.shape[0] / img.shape[1]img_resize = cv2.resize( img, ( 640, int( 640*ratio ) ), interpolation=cv2.INTER_CUBIC )#将Opencv中图像默认BGR转换为通用的RGB格式img_rgb = cv2.cvtColor( img_resize, cv2.COLOR_BGR2RGB )(height, width, channels) = img_rgb.shape#将图像数据转换为需要进行Kmeans聚类的Dataimg_data = img_rgb.reshape( height*width, channels )print( '[INFO] Kmeans 颜色聚类......' )#调用sklearn中Kmeans函数kmeans = KMeans( n_clusters = args[ 'clusters' ] )kmeans.fit(img_data)#建立颜色与标签的对应字典color_label = {}for i in range( len( kmeans.cluster_centers_ ) ):color_label[i] = kmeans.cluster_centers_[i]print( '    颜色以及其对应的标签为: {}'.format( color_label ) )#计算聚类结果, 各颜色及其所含像素数目 color_num = {} for m in range( len( np.unique( kmeans.labels_ ) ) ):print( np.sum( kmeans.labels_ == m ) )print( color_label[m] )#标签m对应的色彩color_num[ np.sum( kmeans.labels_ == m ) ] =  color_label[m] print( '    色彩排序前字典映射为: {}'.format( color_num ) )color_num_sorted = sorted( color_num.items(), key = lambda x:x[0], reverse = True )print( '    色彩排序后字典映射为: {}'.format( color_num_sorted) )color_num_ratio = []for i in range( len( color_num_sorted )   ):color_num_ratio.append( color_num_sorted[i][0] )color_num_ratio = color_num_ratio / np.sum( color_num_ratio )print( '    色彩数目求取比例之后: {}'.format( color_num_ratio ) )print( '[INFO] 显示色卡图像......' )#创建带有色卡的图像color_card = np.zeros( shape = ( height, width + 100, 3 ), dtype = np.int32 )#图像左侧区域复制源图像for i in range(height):for j in range(width):color_card[i][j] = img_rgb[i][j]#图像右侧显示色卡start = 0for i in range( len( kmeans.cluster_centers_ ) ):color = color_num_sorted[i][1]row_start = int ( color_num_ratio[i] * height )#由于前面的比例为小数,转为Int导致最后部分区域没有色彩,采用最后一种颜色进行填充if i == len( kmeans.cluster_centers_ ) - 1:color_card[start:, width:width+100] = colorcolor_card[start: start +row_start, width:width+100] = colorstart += row_startplt.imshow( color_card )plt.show()

[Python与图像处理]利用Python与Kmeans聚类分析图像主色彩相关推荐

  1. [Python与图像处理]利用Python与Opencv实现图像长曝光

    如何使用OpenCV和Python实现摄影中常见的长曝光效果   该任务可简单实现摄影中的长曝光效果. 什么是长曝光?   长曝光是摄影中的一种技术,当采用这项技术之后,流水.云朵可以像丝绸一般柔顺. ...

  2. 【Python例】利用 python 进行用户画像词云图的生成 --- wordcloud

    [Python例]利用 python 进行用户画像词云图的生成 - wordcloud 本文主要用于记录,并使用 python 脚本进行用户画像的词云图的生成. 前言 对于词云图来说,是一个用户画像数 ...

  3. 【Python例】利用 python 进行图片文字信息的提取 --- OCR-EasyOCR

    [Python例]利用 python 进行图片文字信息的提取 - OCR-EasyOCR 本文主要用于记录,并使用 python 脚本进行图片文字信息的生成. 什么是 OCR? OCR OCR(Opt ...

  4. boxplot用法 python,[Python画图笔记]利用Python画箱型图boxplot

    [Python画图笔记]利用Python画箱型图boxplot [Python画图笔记]利用Python画箱型图boxplot 最近在学习使用Python画图,想用subplot画两幅箱型图,分别用来 ...

  5. 动态照片墙 python 实现_利用python生成照片墙的示例代码

    这篇文章主要介绍了利用python生成照片墙的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 PIL(Python Im ...

  6. python 离散化_利用Python将数值型特征进行离散化操作的方法

    利用Python将数值型特征进行离散化操作的方法 如下所示: data = np.random.randn(20) factor = pd.cut(data,4) pd.get_dummies(fac ...

  7. 动态照片墙 python 实现_使用Python生成照片墙,利用,python

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为: PIL . PI ...

  8. python画曲线-利用python画出AUC曲线的实例

    以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer ...

  9. 利用python发送邮件_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

最新文章

  1. [剑指offer] 用两个栈实现队列
  2. vmare安装ghostwin7
  3. 计算机等级考试属于什么培训,计算机等级是什么
  4. 4 项目开发 - 后台
  5. docker-compose安装部署ELK
  6. 红色警报 (25 分)【测试点分析】【两种解法】
  7. 如何提高天猫入驻成功率?掌握这两点即可
  8. python字符串startswith_Python 字符串 startswith() 使用方法及示例
  9. python 桌面提醒_使用Python获取桌面通知
  10. ecshop始终显示全部分类
  11. 网络协议详解1 - NBNS
  12. 电路交换、报文交换、分组交换
  13. HBuilder X详细教程
  14. 一文看懂,互联网这30年!
  15. 操作系统--windows系列之windows8
  16. SDUTOJ 2777 小P的故事——神奇的换零钱 背包
  17. PHP上传ZIP压缩包并解压
  18. 18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】
  19. NPOI使用Excel批注导入数据
  20. web 服务端与客户端交互

热门文章

  1. Maven---本地仓库访问私服配置
  2. matlab卡方分布的随机数,MATLAB产生随机数
  3. Java奠基】数组的讲解与使用
  4. 站长网图王采访51la 杨队QQ群对话记录
  5. download video from ku6 web site and change to mp3
  6. Unity3d Note8(粒子光环)
  7. EasyX教程(一)续:画十字
  8. 本地html本地xml文件怎么打开,xml文件怎么打开?
  9. 【Codewars】7×7 摩天大楼
  10. 在多普达586手机设置彩信的接收