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 base64编码解码实例
Jun 21 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
python 弹窗提示警告框MessageBox的实例
Jun 18 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
python获取栅格点和面值的实现
Mar 10 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
Python 生成短8位唯一id实战教程
Jan 13 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
Python数据可视化之基于pyecharts实现的地理图表的绘制
python使用PySimpleGUI设置进度条及控件使用
You might like
将PHP作为Shell脚本语言使用
2006/10/09 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
PHP正则表达式入门教程(推荐)
2016/05/18 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
python获取标准北京时间的方法
2015/03/24 Python
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
师范应届生语文教师求职信
2013/10/29 职场文书
英语专业毕业生自荐信范文
2013/12/31 职场文书
房屋买卖协议书
2014/04/10 职场文书
物流管理专业自荐信
2014/06/23 职场文书