大佬教程收集整理的这篇文章主要介绍了毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@Author:Runsen
图像分割是将图像分割成多个不同区域(或片段)的过程。目标是将图像的表示变成更容易和更有意义的图像。
在这篇博客中c;我们将看到一种图像分割方法c;即K-Means Clustering。
K-Means 聚类是一种无监督机器学习算法c;旨在将N 个观测值划分为K 个聚类c;其中每个观测值都属于具有最近均值的聚类。集群是指由于某些相似性而聚合在一起的数据点的集合。对于图像分割c;这里的簇是不同的图像颜色。
我们使用的环境是pip install opencv-python numpy matplotlib@H_616_19@
选择的图片是我们学校毕业照的图片c;放心这里没有我c;在学校公众号找的美图。
导入所需模块:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# read the image
image = cv2.imread("Graduation.jpg")
@H_616_19@
在进行图像分割之前c;让我们将图像转换为RGB格式:
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
@H_616_19@
我们将使用cv2.kmeans()函数c;它将一个2D数组作为输入c;并且由于我们的原始图像是3D(宽度、高度和深度为3 个 RGB值)c;我们需要将高度和宽度展平为单个像素向量(3 个 RGB值):
# 将图像重塑为像素和3个颜色值(RGB)的2D数组
print(image.shape) #(853, 1280, 3)
pixel_values = image.reshape((-1, 3))
# 转换为numpy的float32
pixel_values = np.float32(pixel_values)
print(pixel_values.shape) #(1091840, 3)
@H_616_19@
关于opencv下的kmean算法c;函数为cv2.kmeans()@H_616_19@ 函数的格式为:
kmeans(data, K, bestLabels, criteria, attempts, flags)@H_616_19@
(type,max_iter,epsilon)@H_616_19@c;@H_190_18@max_iter@H_616_19@迭代次数c;epsilon@H_616_19@结果的精确性 其中c;type又有三种选择:
cv2.KMEANS_PP_CENTERS@H_616_19@ 算法kmeans++的center; cv2.KMEANS_RANDOM_CENTERS@H_616_19@随机初始化
在这里c;我们需要设置criteria@H_616_19@确定停止标准。我们将在超过某些迭代次数(例如500)时停止c;或者如果集群移动小于某个 epsilon 值(让我们在这里选择0.1)c;下面的代码在OpenCV 中定义了这个停止标准:
# 确定停止标准
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 500, 0.1)
@H_616_19@
上面图像c;会发现五种主要颜色(分别是天空、草地、树、人的上身白c;人的下身黑)
因此c;我们将为这张图片使用K=5:
k = 5
_, labels, (centers) = cv2.kmeans(pixel_values, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
@H_616_19@
cv2.KMEANS_RANDOM_CENTERS只是指示OpenCV最初随机分配集群的值。
我们将扁平化的图像像素值转换为浮点数32类型c;是因为cv2.kmeans() 浮点数32类型c;然后c;让我们将浮点数转换回8 位像素值np.uint8(centers)@H_616_19@:
# 转换回np.uint8
centers = np.uint8(centers)
# 展平标签阵列
labels = labels.flatten()
segmented_image = centers[labels.flatten()]
@H_616_19@
转换回原始图像形状并显示:
#重塑回原始图像尺寸
segmented_image = segmented_image.reshape(image.shape)
plt.imshow(segmented_image)
plt.show()
@H_616_19@
@H_450_350@
当然c;我们还可以禁用图像中的一些K-Means 聚类集群。例如c;让我们禁用集群编号1并显示图像:# 禁用2号群集(将像素变为黑色)
masked_image = np.copy(segmented_image)
# 转换为像素值向量的形状
masked_image = masked_image.reshape((-1, 3))
cluster1 = 1
masked_image[labels == cluster1] = [0, 0, 0]
# 转换回原始形状
masked_image = masked_image.reshape(image.shape)
plt.imshow(@H_680_33@masked_image)
plt.show()
@H_616_19@
原来K-Means 聚类2 号集群 是树。
请注意c;还有其他分割技术c;例如霍夫变换、轮廓检测和当前最先进的语义分割。
对此推荐大佬给你们
[Python图像处理] 四十.全网首发Python图像分割万字详解(阈值分割、边缘分割、纹理分割、分水岭算法、K-Means分割、漫水填充分割、区域定位)
以上是大佬教程为你收集整理的毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割全部内容,希望文章能够帮你解决毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。