在文章

今天我用Python手写了一个K-means算法,来完成同样的功能。

聚类是数据挖掘中一种非常重要的学习流派,指将未标注的样本数据中相似的分为同一类,正所谓“物以类聚,人以群分”。

K-means是聚类算法中最为简单、高效的,核心思想:由用户指定k个初始中心,以作为聚类的类别,重复迭代更新数据集的中心直至算法收敛。

代码有点长,关键代码我会进行分析,其余代码没必要进行分析。

首先,我们定义一个计算距离的方法,我采用的是欧氏距离。

def get_euclidean_distance(_pixel, _center):

"""

获得欧氏距离

:param _pixel: 像素

:param _center: 中心

:return: 欧氏距离

"""

d_pow_2 = 0

for _channel_index in range(n_channels):

d_pow_2 += pow(_pixel[_channel_index] - _center[_channel_index], 2)

return np.sqrt(d_pow_2)

然后定义一个方法来计算中心,方便之后进行迭代。

def get_nearest_center(_pixel):

"""

获得最近的中心

:param _pixel: 像素

:return: 最近的中心的index

"""

min_center_d = get_euclidean_distance(_pixel, centers[0])

min_center_index = 0

for _center_index in range(1, k):

d = get_euclidean_distance(_pixel, centers[_center_index])

if d < min_center_d:

min_center_d = d

min_center_index = _center_index

return min_center_index

下面的模块用于计算新的中心,体现了K-means的关键思想。

def cal_new_center():

"""

如果有的中心没有最邻近的,那就说明选到了俩一样颜色的中心(虽然概率很小)那就重新选一个

:return: 新的中心

"""

# 归零

center_counts = np.zeros(k, dtype=int)

_centers = np.zeros((k, n_channels), dtype=int)

# 对每个类逐通道求和

for _pixel_index in range(n_pixels):

center_counts[labels[_pixel_index]] += 1

for _channel_index in range(n_channels):

_centers[labels[_pixel_index]][_channel_index] += img[_pixel_index][_channel_index]

# 对每个中心算出均值

for _center_index in range(k):

if center_counts[_center_index] > 0:

for _channel_index in range(n_channels):

_centers[_center_index][_channel_index] /= center_counts[_center_index]

else:

# 要是中心选重了就重新再选一个(虽然概率很小)

_centers[_center_index] = img[random.randint(0, n_pixels - 1)]

print('WARNING: Center %d has no pixel, re-choose center randomly...' % _center_index)

return _centers

上面的代码已经完成了K-means的关键部分,其他的代码都是在对图像像素进行遍历处理,以及得到K-means聚类后进行输出。代码已经上传在github上了:https://github.com/shulisiyuan/mainColor

我使用这张图片进行了测试,设置的中心点K=4

下面是代码跑出来的结果,可以看出下面的四种颜色主要就是图片中的颜色。

这种方法跑的比较慢,有很多可以优化的地方,后续有时间再慢慢优化。

打算收集大量图片进行分析,构建一个相似颜色图片的聚类。简单实现Google的图图片颜色聚类功能。

python颜色识别算法_纯Python编写K-means算法,提取图片中的主体颜色相关推荐

  1. python 提取图片的某个颜色_使用python提取图片中的主体颜色

    上次国庆节去谷歌开发者大会,体验了很多有趣的人工智能项目. 其中有一个颜色匹配的环节,叫做"AI调色板,解码缤纷艺术世界",让我觉得很有意思,回来后,我计划自己实现一个类似的功能. ...

  2. python矩阵乘法算法_纯python进行矩阵的相乘运算的方法示例

    本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...

  3. python 训练识别验证码_用Python机器学习搞定验证码

    原标题:用Python机器学习搞定验证码 写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类 今天先来看看图像类,这类验证码大多是数字.字母的组合,国内也 ...

  4. python人脸识别库_基于Python的face_recognition库实现人脸识别

    Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...

  5. python进行矩阵计算公式_纯python进行矩阵的相乘运算的方法示例

    本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...

  6. k近邻算法_【机器学习】K近邻算法(KNN)

    点击关注上方"小田学python",获取更多精彩内容 机器学习是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的 ...

  7. python条形码识别系统_基于Python与Zbar的无人机盘点条形码识别研究

    2018 年 第 6 期 第 4 0 卷 总 第 2 8 8 期 物流工程与管理 LOGISTICS ENGINEERING AND MANAGEMENT 物流技术 doi :10.3969/ j . ...

  8. python人脸识别项目_基于Python与命令行人脸识别项目(系列二)

    在knowe_people文件夹中创建blur_faces_on_webcam.py文件并写入以下代码: import face_recognition import cv2 # This is a ...

  9. python百度识别花草_用python代码实现调用百度的免费植物识别接口

    # coding=utf-8 import requests import base64 import unittest import time class WordScanTest(unittest ...

最新文章

  1. Delphi中将DBGRID中的内容输出到WORD中
  2. 蓝牙BLE ATT剖析(一)
  3. html网页缩小之后div框移动,css – DIV在浏览器中放大和缩小时移动
  4. 计算机检索技巧知识,初学者常用电脑技巧知识
  5. windows下的diskpart指令彻底格式化清除U盘
  6. python将dataframe导出为csv_python将dataframe转换为csv,为每列导出一个格式独特的文本文件...
  7. 前端导出excel文件带样式_vue前端使用xlsx导出数据到excel中--最简单的方式
  8. linux环境下企业基于域名访问的web于电子邮件服务器 论文,基于Linux平台的企业邮件服务器搭建...
  9. ajaxFileUpload plugin上传文件 chrome、Firefox中出现SyntaxE
  10. 从mysql数据库读取Blob_读取数据库Blob类型的文本数据
  11. 经常用到的一些小病的预防的治疗
  12. SAP SolMan 严重漏洞的自动化 exploit 代码遭公开
  13. laravel leftjoin 右侧取最新一条_高铁规划:湖南至广西将增添一条高铁,填补中西部地区铁路网空白...
  14. linux svn与apache,linux下svn与apache整合搭建
  15. 六款顶级Wifi无线网络搜索工具盘点
  16. python 模拟键盘_用Python模拟键盘输入
  17. 【论文阅读】A Survey of Incentive Mechanism Design for Federated Learning 联邦学习激励机制设计综述
  18. mysql-mmm高可用群集
  19. 微信公众号整套逻辑的支付和退款
  20. OpenStack安装部署报错记录,Error processing default value xxx for Opt type of HostAddress

热门文章

  1. SQL语句操作优先级顺序
  2. relative和absolute使用
  3. JAVA和C浮点数,为什么在C ++和Java中使用float函数会产生不同的结果?
  4. python创建列表副本_Python编程15:Python列表的排序和列表的副本
  5. 中考计算机考试试题山西注意事项,2021年山西省中考考试注意事项(3)
  6. php给网页加水印_php实现图片添加水印功能
  7. 可燃气体浓度多少合格_科普:气体容积单位LEL%、VOL%、TLV(ppm)之间如何换算?...
  8. 小学计算机病毒与危害的课,第一课《电脑病毒与危害》.ppt
  9. java gui 监听组合键,Java之GUI按钮监听事件ActionListener
  10. php中new与构造函数,php - 在构造函数中使用“ new”关键字 - SO中文参考 - www.soinside.com...