OpenCV-Python(48):K均值聚类

目标

  • 学习K值聚类的概念以及工作原理。
  • K均值聚类的OpenCV实现

背景

        下面用一个最常用的例子来给大家介绍K 值聚类。

        话说有一个公司要生产一批新的T 恤。很明显他们要生产不同大小的T 恤来满足不同客客的要求。所以这个公司搜集了很多人的身高和体重信息,并把这些数据绘制在图上,如下所示:

        肯定不能把每个大小的T 恤都生产出来􈙽,所以他们把所有的人分为三组,小,中,大,这三组要覆盖所有的人。我们可以使用K 值聚类的方法将所有人分为3 组,这个算法可以找到一个最好的分法并能覆盖所有人。如果不能覆盖全部人的话,公司就只能把这些人分为更多的组,可能是4 个或5 个甚至更多。如下图:

工作原理 

        这个算法是一个迭代过程,我们会借助图片分步介绍它。考虑下面这组数据,你也可以把它当成T 恤问题来看,我们需要把他们分成两组。

        第一步 随机选取两个重心点C1 和C2(有时可以选取数据中的两个点作为起始重心)。
        第二步 计算每个点到这两个重心点的距离,如果距离C1 比较近,就标记为0,如果距离C2 比较近,就标记为1。(如果有更多的重心点,可以标记为2、3等)

        在我们的例子中我们把属于0 的标记为红色,属于1 的标记为蓝色。我们就会得到下面这幅图。

        第三步 重新计算所有蓝色点的重心和所有红色点的重心,并以这两个点更新重心点的位置。(图片只是为了演示说明而已,并不代表实际数据),重复步骤2,更新所有的点标记。我们就会得到下面的图:

        继续迭代步骤2 和3,直到两个重心点的位置稳定下来。(当然也可以通过设置迭代次数,或者设置重心移动距离的阈值值来终止迭代。此时这些点到它们相应重心的距离之和最小。简单来说C1 到红色点的距离与C2 到蓝色点的距离之和最小。 

最终结果如下图所示: 

        这就是对K 值聚类的一个直观解释。要想知道更多细节和数据,可以去一本关于机器学习的教科书或者参考更多资源中的链接。这只是K 值聚类的基础。现在对这个算法有很多改,比如,如何选取好的初始重心点,怎样加速迭代过程等。 

参考资料:Supervised Learning in Machine Learning: Regression and Classification (DeepLearning.AI) | Coursera

OpenCV中的K值聚类 

        cv2.kmeans()是OpenCV中用于执行k均值聚类的函数。它采用输入数据的特征向量,并将其分成指定数量的簇。

函数的语法如下:

retval, bestLabels, centers = cv2.kmeans(data, K, criteria, attempts, flags, centers)

参数说明:

  • data:输入数据的特征向量,可以是Numpy数组或浮点型矩阵。
  • K:指定要创建的簇的数量。
  • criteria:指定迭代停止的条件,可以是一个元组,包含三个参数:迭代次数、最小误差、最小中心变化。
  • attempts:指定执行算法的次数,每次执行都会选择不同的初始中心。
  • flags:指定使用的计算方法,可以是cv2.KMEANS_RANDOM_CENTERS或cv2.KMEANS_PP_CENTERS。
  • centers:输出参数,包含所有簇的中心点坐标。

返回值说明:

  • retval:返回值表示执行算法的状态,通常为cv2.TERM_CRITERIA_EPS或cv2.TERM_CRITERIA_MAX_ITER之一。
  • bestLabels:每个样本的最佳簇标签。
  • centers:所有簇的中心点坐标。

下面是一个使用cv2.kmeans()函数的简单示例:

import numpy as np
import cv2

# 准备数据
data = np.random.randint(0, 100, (100, 2)).astype(np.float32)

# 设置迭代停止的条件
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)

# 执行k均值聚类
retval, bestLabels, centers = cv2.kmeans(data, 2, None, 10, cv2.KMEANS_RANDOM_CENTERS)

# 打印结果
print("retval:", retval)
print("bestLabels:", bestLabels)
print("centers:", centers)

在上面的示例中,我们首先创建一个包含100个随机二维点的数据集。然后,我们设置了迭代停止的条件,指定要创建2个簇,并使用随机初始中心执行k均值聚类。最后,打印出返回的结果。

请注意,由于k均值聚类是一个迭代算法,结果可能因为初始中心的选择而有所不同。为了获得更好的结果,可以多次执行算法,并选择最佳结果。

颜色量化

        颜色量化就是减少图片中颜色数目的一个过程。为什么要减少图片中的颜色呢?减少内存消耗,有些设备的资源有限,只能显示很少的颜色。在这种情况下就需要对颜色量化。我们使用K 值聚类的方法来进行颜色量化。
        现在有3 个特征R,G,B。所以我们需要把图片数据变形成Mx3(M 是图片中像素点的数目)的向量。聚类完成后,我们用聚类中心值替换与其同组的像素值,这样结果图片就只含有指定数目的颜色了。下面是代码:

import numpy as np
import cv2
img = cv2.imread('home.jpg')
Z = img.reshape((-1,3))
# convert to np.float32
Z = np.float32(Z)
# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
# Now convert back into uint8, and make original image
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))
cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

下面是K=8 的结果: 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/335052.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】编译和链接深度剖析

文章目录 📝前言🌠 翻译环境和运行环境🌉翻译环境 🌠预处理(预编译)🌉编译 🌠词法分析🌠语法分析 🌉语义分析🌠汇编 🌉 链接&#x1f…

23号资源——电力系统程序集合已提供下载资源

23号资源:程序集合包含9个程序(经典电力系统经济调度程序;2解决带储;3智能微电网PSO优化算法;微电网调度等等,见资源描述)资源-CSDN文库https://download.csdn.net/download/LIANG674027206/887…

C++继承(万字详!!)

文章目录 继承的概念及定义继承的概念继承定义 基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱形继承及菱形虚拟继承菱形继承菱形虚拟继承 继承的总结和反思笔试面试题 继承的概念及定义 继承的概念 继承(inheritance) 机制是面…

【Docker】实战多阶段构建 Laravel 镜像

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 本节适用于 PHP 开发者阅读。Laravel 基于 8.x 版本,各个版本的文件结构可能会有差异,请根据实际自行修改。 准备 新…

开源模型应用落地-qwen模型小试-入门篇(五)

一、前言 这是关于qwen模型入门的最后一篇文章。主要介绍如何使用魔搭的API在本地调用qwen模型。此外,通过阅读这一系列的文章,如果您真的亲自动手实践过,我相信您已经掌握了qwen模型的基本使用方法。 二、术语 2.1. ModelScope社区 打造下一…

HCIA—— 16每日一讲:HTTP和HTTPS、无状态和cookie、持久连接和管线化、(初稿丢了,这是新稿,请宽恕我)

学习目标: HTTP和HTTPS、无状态和cookie、持久连接和管线化、HTTP的报文、URI和URL(初稿丢了,这是新稿,请宽恕我😶‍🌫️) 学习内容: HTTP无状态和cookieHTTPS持久连接和管线化 目…

流量控制与熔断利器:Sentinel介绍

这是《百图解码支付系统设计与实现》专栏系列文章中的第(19)篇,也是流量控制系列的第(6)篇。点击上方关注,深入了解支付系统的方方面面。 本篇聊聊流量控制与熔断利器Sentinel,背后的原理&…

分享行政检察院法律监督模型的构建价值和运用范式

数字检察是检察工作现代化的重要依托。在数字化时代背景下,行政检察监督办案要深入推进检察大数据战略,推动办案模式从“个案为主、数量驱动”向“类案为主、数据赋能”转变,通过数据分析、数据碰撞、数据挖掘发现治理漏洞或者监督线索&#…

项目上线存在的缓存问题以及存在的debugger和console.log等问题

下载uglifyjs-webpack-plugin插件 在vue.config文件中进行配置 publicPath: process.env.NODE_ENV production ? ./ : /,outputDir: n-sim-ipc-manage-build,productionSourceMap: false,configureWebpack: config > {//打包文件增加hashconfig.output.filename js/[nam…

大模型日报-20240120

这里写目录标题 视觉Mamba来了:速度提升2.8倍,内存能省87%一键实景转动画,清华系初创公司全球首发4D骨骼动画框架,还能生成个性化角色如何利用革命性的蛋白质结构工具来发现药物?AlphaFold 发现了数千种可能的致幻剂扎…

IPFoxy运营干货|谷歌广告Google Ads建立广告需要注意什么?

编辑投放谷歌广告需要多少个步骤和什么准备工作,本文将来讲述,主要分5个内容:一、投放前竞对研究;二、投放前广告账户设置;三、建立广告系列;四、建立广告组;五、广告长期策略。接下来我们来开始…

Python 面向对象绘图(Matplotlib篇-16)

Python 面向对象绘图(Matplotlib篇-16)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

链表存数相加算法(leetcode第2题)

题目描述: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这…

无偿分享一个很有用的看源码小技巧

怎么在 idea 里面查看 git 提交记录呢?这个界面是藏在哪里的呢,我的 idea 里面怎么没有呢? 好的,是我疏忽了,我先入为主的认为这个大家应该都知道是怎么来的。 但是确实是有一些同学是不太清楚的,那我这篇…

大数据导论(2)---大数据与云计算、物联网、人工智能

文章目录 1. 云计算1.1 云计算概念1.2 云计算的服务模式和类型1.3 云计算的数据中心与应用 2. 物联网2.1 物联网的概念和关键技术2.2 物联网的应用和产业2.3 大数据与云计算、物联网的关系 1. 云计算 1.1 云计算概念 1. 首先从商业角度给云计算下一个定义:通过网络…

C#调用C++ dll异常排查

基本情况 最近在做的一款程序,长时间运行总会出现莫名的问题。有时是自动关闭,有时程序报错,有时调用的dll异常…… 提出假设——dll内存泄漏 由于开始与C组合作时,使用其提供的dll出现过数据读写时异常(内存操作异常…

Leetcoder Day9|栈与队列part01

语言:Java/C 目录 理论基础 C 栈 队列 Java 栈 队列 ​编辑 232.用栈实现队列 225. 用队列实现栈 Queue Deque 今日心得 理论基础 又是考研时数据结构里接触到的老朋友,栈是先进后出,队列是先进先出。 C 现在刷题除了思路还…

CHAPTER 11: 《DESIGN A NEWS FEED SYSTEM》 第 11 章:《设计新闻系统》

在本章中,您将被要求设计一个新闻提要系统。什幺是新闻系统?根据Facebook 页面,“News feed 是中间不断更新的故事列表。您的主页。动态消息包括状态更新、照片、视频、链接、应用活动记录和喜欢您在 Facebook 上关注的人、页面和群组“[1]。…

linux C语言socket函数send

在Linux中,使用C语言进行网络编程时,send函数是用于发送数据到已连接的套接字的重要函数之一。它通常用于TCP连接,但也可以用于UDP(尽管对于UDP,通常更推荐使用sendto,因为它允许你指定目标地址和端口&…

插入排序(一)——直接插入排序与希尔排序

目录 一.前言 二.排序的概念及其运用 1.1排序的概念 1.2 常用排序算法 三.常用排序算法的实现 3.1 插入排序 3.1.1 基本思想 3.1.2 直接插入排序 3.1.3 希尔排序(缩小增量排序) 四.全部代码 sort.c sort.h test.c 五.结语 一.前言 本文我们…