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


Posted in Python onJune 11, 2021

图像分割是将图像分割成多个不同区域(或片段)的过程。目标是将图像的表示变成更容易和更有意义的图像。

在这篇博客中,我们将看到一种图像分割方法,即K-Means Clustering

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

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

选择的图片是我们学校毕业照的图片,放心这里没有我,在学校公众号找的美图。

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

导入所需模块:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# read the image
image = 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的float32
pixel_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.uint8
centers = 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 = 1
masked_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聚类对毕业照进行图像分割的文章就介绍到这了,更多相关OpenCV和K-Means图像分割内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python交换变量
Sep 06 Python
python网络编程之文件下载实例分析
May 20 Python
python基于右递归解决八皇后问题的方法
May 25 Python
python+opencv实现的简单人脸识别代码示例
Nov 14 Python
使用Python的turtle模块画图的方法
Nov 15 Python
python用plt画图时,cmp设置方法
Dec 13 Python
基于Python在MacOS上安装robotframework-ride
Dec 28 Python
Python离线安装PIL 模块的方法
Jan 08 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
Python数据可视化之基于pyecharts实现的地理图表的绘制
python使用PySimpleGUI设置进度条及控件使用
You might like
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
基于python时间处理方法(详解)
2017/08/14 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
理论讲解python多进程并发编程
2018/02/09 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
python对象与json相互转换的方法
2019/05/07 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
python自动下载图片的方法示例
2020/03/25 Python
法国体育用品商店:GO Sport
2019/10/23 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
网络编辑岗位职责范本
2014/02/10 职场文书
学习计划书怎么写
2014/09/15 职场文书