程序笔记   发布时间:2022-07-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了毕业了,在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;在学校公众号找的美图。

毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割

导入所需模块:

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@

  • data: 分类数据࿰c;最好是np.float32的数据࿰c;每个特征放一列。之所以是np.float32原因是这种数据类型运算速度快c;如果是uint型数据将会很慢。
  • K: 分类数࿰c;opencv2的kmeans分类是需要已知分类数的。
  • bestLabels:预设的分类标签:没有的话 None
  • criteria:迭代停止的模式选择࿰c;这是一个含有三个元素的元组型数。格式为(type,max_iter,epsilon)@H_616_19@࿰c;@H_190_18@max_iter@H_616_19@迭代次数࿰c;epsilon@H_616_19@结果的精确性 其中࿰c;type又有三种选择:
    • cv2.TERM_CRITERIA_EPS :精确度(误差)满足epsilon停止。
    • cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过max_iter停止
    • cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER࿰c;两者合体࿰c;任意一个满足结束。-
  • attempts:重复试验kmeans算法次数࿰c;将会返回最好的一次结果
  • flags:初始类中心选择࿰c;两种方法 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@

毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割

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

请注意࿰c;还有其他分割技术࿰c;例如霍夫变换、轮廓检测和当前最先进的语义分割。

对此推荐大佬给你们

[Python图像处理] 四十.全网首发Python图像分割万字详解(阈值分割、边缘分割、纹理分割、分水岭算法、K-Means分割、漫水填充分割、区域定位)

大佬总结

以上是大佬教程为你收集整理的毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割全部内容,希望文章能够帮你解决毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。