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

这篇具有很好参考价值的文章主要介绍了OpenCV-Python(48):K均值聚类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标

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

背景

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

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

OpenCV-Python(48):K均值聚类,opencv-python,opencv,python,均值算法,K-means,K均值,颜色量化

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

OpenCV-Python(48):K均值聚类,opencv-python,opencv,python,均值算法,K-means,K均值,颜色量化

工作原理 

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

OpenCV-Python(48):K均值聚类,opencv-python,opencv,python,均值算法,K-means,K均值,颜色量化

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

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

OpenCV-Python(48):K均值聚类,opencv-python,opencv,python,均值算法,K-means,K均值,颜色量化

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

OpenCV-Python(48):K均值聚类,opencv-python,opencv,python,均值算法,K-means,K均值,颜色量化

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

OpenCV-Python(48):K均值聚类,opencv-python,opencv,python,均值算法,K-means,K均值,颜色量化

最终结果如下图所示: 

OpenCV-Python(48):K均值聚类,opencv-python,opencv,python,均值算法,K-means,K均值,颜色量化

        这就是对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 的结果: 

OpenCV-Python(48):K均值聚类,opencv-python,opencv,python,均值算法,K-means,K均值,颜色量化

 文章来源地址https://www.toymoban.com/news/detail-808396.html

到了这里,关于OpenCV-Python(48):K均值聚类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv-python安装

    OpenCV就是学习计算机视觉的过程中经常用到的工具,opencv降低了计算机视觉的学习门槛。随着机器学习、深度学习等技术的发展,Python庞大的扩展库为Python用户在编程过程中提供了极大的便利,opencv-python便是其中一员。在实际使用opencv-python扩展库的过程中,更多的读者关心

    2024年02月04日
    浏览(90)
  • 安装opencv-python

    1.由于之前pip install --upgrade pip出错了,导致Anaconda中Scripts中pip.exe出错 解决方式:python -m ensurepip --default-pip,获得可行的pip.exe 可行的升级pip的方式:python -m pip install --upgrade pip 2.安装opencv-python 尝试从官网安装,官网提示需要更新pip 但是更新出错了,于是有了1问题,pip.exe不

    2024年02月06日
    浏览(53)
  • opencv-python 降噪

    定义 图像噪声是指存在于图像数据中的 不必要的或多余的干扰信息 。噪声的存在严重影响了图像的质量,因此在图像增强处理和分类处理之前,必须予以纠正。 图像中各种妨碍人们对其信息接受的因素即可称为图像噪声 。噪声在理论上可以定义为“不可预测,只能用概率

    2024年02月03日
    浏览(43)
  • Python:安装opencv-python出错问题ERROR: Could not build wheels for opencv-python

    笔者在安装opencv-python的过程中遇到了如下错误 在安装opencv-python的过程,笔者直接通过pip命令进行安装,遇到了如下问题 命令 问题 直接使用上述命令安装的是最新版本,挑一个别的版本的opencv-python即可解决上述问题 使用命令如下 问题解决

    2024年02月11日
    浏览(67)
  • opencv-python版本问题

    opencv库有两种,一种是 opencv-python ,另一种是 opencv-contrib-python 。前者是基础库,后者则是在前者基础上加了一些contrib module(视觉处理一般用这个)。 安装好OpenCV库,想着先在OpenCV的瀚海里扎两个猛子。没成想,一头扎下去便撞到石头上。 如下图,在键入cv2.imread()时,不仅

    2024年02月13日
    浏览(46)
  • OpenCV-Python(21):OPenCV查找及绘制轮廓

    1.1 目标 理解什么是轮廓 学习掌握找轮廓、绘制轮廓等 学习使用cv2.findContours()、cv2.drawContours()函数的用法 1.2 什么是轮廓         在OpenCV中,轮廓是 图像中连续的边界线的曲线,具有相同的颜色或者灰度,用于表示物体的形状 。轮廓在图像处理和计算机视觉中非常重要

    2024年01月18日
    浏览(46)
  • pip安装opencv-python

    OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的I

    2023年04月22日
    浏览(54)
  • opencv-python常用函数汇总

    环境配置地址 Anaconda:https://www.anaconda.com/download/ Python_whl:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv 代码如下(示例): cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。 如果是视频文件,直接指定好路径即可。 BORDER_REPLICATE:复制法,也就是复制最边缘像素。

    2024年02月07日
    浏览(50)
  • openCV-python模板匹配(旋转)

    本文将介绍使用OpenCV实现多角度模板匹配的详细步骤 + 代码。 熟悉OpenCV的朋友肯定都知道OpenCV自带的模板匹配matchTemplate方法是不支持旋转的,也就是说当目标和模板有角度差异时匹配常常会失败,可能目标只是轻微的旋转,匹配分数就会下降很多,导致匹配精度下降甚至匹

    2024年02月01日
    浏览(65)
  • OpenCv-Python图像特征识别

    本练习学习了OpenCv-Python关于图像特征识别的一些算法,算法理解起来较为困难,但函数用起来上手比较快,主要要明白函数的输入输出的含义。 虽然算法理解不容易,但程序还算有趣,输入是一个完整的图片和一组图片碎片,如下图,然后经过算法计算,把碎片匹配到正确

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包