iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割
  • 939
分享到

Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割

2023-06-15 11:06:27 939人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家分享的是有关python如何使用OpenCV和K-Means聚类对毕业照进行图像分割的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们将看到一种图像分割方法,即K-Means Clustering。

这篇文章给大家分享的是有关python如何使用OpenCV和K-Means聚类对毕业照进行图像分割的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

我们将看到一种图像分割方法,即K-Means Clustering

K-Means 聚类是一种无监督机器学习算法,旨在将N 个观测值划分为K 个聚类,其中每个观测值都属于具有最近均值的聚类。集群是指由于某些相似性而聚合在一起的数据点的集合。对于图像分割,这里的簇是不同的图像颜色。

我们使用的环境是pip install opencv-Python numpy matplotlib

导入所需模块:

import cv2import numpy as npimport matplotlib.pyplot as plt# read the imageimage = cv2.imread("Graduation.jpg")

在进行图像分割之前,让我们将图像转换为RGB格式:

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

我们将使用cv2.kmeans()函数,它将一个2D数组作为输入,并且由于我们的原始图像是3D(宽度、高度和深度为3 个 RGB值),我们需要将高度和宽度展平为单个像素向量(3 个 RGB值):

# 将图像重塑为像素和3个颜色值(RGB)的2D数组print(image.shape) #(853, 1280, 3)pixel_values = image.reshape((-1, 3))# 转换为numpy的float32pixel_values = np.float32(pixel_values)print(pixel_values.shape) #(1091840, 3)

关于opencv下的kmean算法,函数为cv2.kmeans()
函数的格式为:kmeans(data, K, bestLabels, criteria, attempts, flags)

data: 分类数据,最好是np.float32的数据,每个特征放一列。之所以是np.float32原因是这种数据类型运算速度快,如果是uint型数据将会很慢。

K: 分类数,opencv2的kmeans分类是需要已知分类数的。

bestLabels:预设的分类标签:没有的话 None

criteria:迭代停止的模式选择,这是一个含有三个元素的元组型数。格式为(type,max_iter,epsilon)max_iter迭代次数,epsilon结果的精确性

其中,type又有三种选择:

  • cv2.TERM_CRITERIA_EPS :精确度(误差)满足epsilon停止。

  • cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过max_iter停止

  • cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,两者合体,任意一个满足结束。

  • - attempts:重复试验kmeans算法次数,将会返回最好的一次结果

flags:初始类中心选择,两种方法

cv2.KMEANS_PP_CENTERS 算法kmeans++的center; cv2.KMEANS_RANDOM_CENTERS随机初始化

在这里,我们需要设置criteria确定停止标准。我们将在超过某些迭代次数(例如500)时停止,或者如果集群移动小于某个 epsilon 值(让我们在这里选择0.1),下面的代码在OpenCV 中定义了这个停止标准:

# 确定停止标准criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 500, 0.1)

上面图像,会发现五种主要颜色(分别是天空、草地、树、人的上身白,人的下身黑)

因此,我们将为这张图片使用K=5:

k = 5_, labels, (centers) = cv2.kmeans(pixel_values, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

cv2.KMEANS_RANDOM_CENTERS只是指示OpenCV最初随机分配集群的值。

我们将扁平化的图像像素值转换为浮点数32类型,是因为cv2.kmeans() 浮点数32类型,然后,让我们将浮点数转换回8 位像素值np.uint8(centers)

# 转换回np.uint8centers = np.uint8(centers)# 展平标签阵列labels = labels.flatten()segmented_image = centers[labels.flatten()]

转换回原始图像形状并显示:

#重塑回原始图像尺寸segmented_image = segmented_image.reshape(image.shape)plt.imshow(segmented_image)plt.show()

Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割

当然,我们还可以禁用图像中的一些K-Means 聚类集群。例如,让我们禁用集群编号1并显示图像:

# 禁用2号群集(将像素变为黑色)masked_image = np.copy(segmented_image)# 转换为像素值向量的形状masked_image = masked_image.reshape((-1, 3))cluster1 = 1masked_image[labels == cluster1] = [0, 0, 0]# 转换回原始形状masked_image = masked_image.reshape(image.shape)plt.imshow(masked_image)plt.show()

Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割

原来K-Means 聚类2 号集群 是树。

感谢各位的阅读!关于“Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割

本文链接: https://www.lsjlt.com/news/279925.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作