OpenCV 图像分割实现Kmean聚类的示例代码
作者:山居秋暝LS 发布时间:2023-08-10 18:59:41
标签:OpenCV,Kmean,聚类
1 Kmean图像分割
按照Kmean原理,对图像像素进行聚类。
优点:此方法原理简单,效果显著。
缺点:实践发现对于前景和背景颜色相近或者颜色区分度差的图像效果不显著。
本文对图像进行滤波,主要是为了消除树枝颜色的影响(滤波为非Keman图像分割的必要操作)。
2 流程
(1)读入图片,把图片转化为二维。
(2)根据Kmean算法对图像分割,返回类别标签和各类别中心点。
(3)根据类别标签复制各类别中心点得到结果,在对结果调整到原有尺度。
3 实现
(1)图像分割前添加滤波,消除噪声
## 1 图像分割--Keman聚类
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1 读入图片
img0 = cv2.imread('bird.png', 1) # (548,727,3)
img0 = cv2.cvtColor(img0, cv2.COLOR_BGR2RGB)
img_ = cv2.GaussianBlur(img0, (13, 13), 10, 10)
h, w, c = img_.shape
img_blur = img_.reshape([-1, 3])
img_blur = np.float32(img_blur)
# 2 分类
criteria = (
cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
num_clusters = 2
_, label, center_color = cv2.kmeans(img_blur, num_clusters,
None, criteria,
num_clusters,
cv2.KMEANS_RANDOM_CENTERS)
center_color = np.uint8(
center_color) # img_blur[398396,3],label[398396,1],center[2,3]
res = center_color[label.ravel()] # [398396,3]
res = res.reshape([h, w, c]) # res[668044,3]--> [548,727,3]
# 3 显示
plt.subplot(131)
plt.title('origin')
plt.imshow(img0)
plt.subplot(132)
plt.title('img_blur')
plt.imshow(img_)
plt.subplot(133)
plt.title('result')
plt.imshow(res)
plt.show()
(2)颜色区分低的情况
当颜色区分低时,划分较少的种类,可以达到满意效果。
## 1 图像分割--Keman聚类
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1 读入图片
img = cv2.imread('luna.png', 1) # (548,727,3)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w, c = img.shape
img0= img.reshape([-1, 3])
img0 = np.float32(img0)
# 3 分类
criteria = (
cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
num_clusters = 2
_, label, center_color = cv2.kmeans(img0, num_clusters,
None, criteria,
num_clusters,
cv2.KMEANS_RANDOM_CENTERS)
center_color = np.uint8(
center_color) # img_blur[398396,3],label[398396,1],center[2,3]
res = center_color[label.ravel()] # [398396,3]
res = res.reshape([h, w, c]) # res[668044,3]--> [548,727,3]
plt.subplot(121)
plt.title('origin')
plt.imshow(img)
plt.subplot(122)
plt.title('result')
plt.imshow(res)
plt.show()
注: 可以改变中心点的数值,调整分割后图像的颜色。
center_color = np.uint8(
center_color)
## 调整显示颜色
center_color[0]=[0,0,255]
center_color[1]=[255,0,0]
res = center_color[label.ravel()]
来源:https://blog.csdn.net/qq_35732321/article/details/123756129


猜你喜欢
- 本文实例讲述了正则表达式匹配ip地址实例。代码结构非常简单易懂。分享给大家供大家参考。主要实现代码如下:import rereip = re
- 1.数据是什么?在 Python 以及其他所有面向对象编程语言中,类都是对数据的构成(状态)以及数据 能做什么(行为)的描述。由于类的使用者
- 一、框架架构二、项目目录结构三、框架功能说明解决痛点:通过session会话方式,解决了登录之后cookie关联处理框架天然支持接口动态传参
- 部署apache服务的步骤:准备环境:关闭防火墙 :service iptables stop设置开机关闭防火墙:chkconfig ipt
- 由于项目是thinkPHP做后端框架,一直以来都是多页面的后端路由,想使用火热的webpack有点无从下手(原谅我太菜,而且推广vue只有我
- 给图像添加颜色在使用OpenCV操作图像时,有时候需要给图像添加不同的颜色,以达到不同的风格效果。这里介绍的主要是opencv中的cv.ap
- 换用非默认浏览器时需要输入密码或token查询方法:在XX:\AnacondaXX\Scripts下 运行jupyter-notebook.
- Python的zip函数示例1:x = [1, 2, 3]y = [4, 5, 6]z = [7, 8, 9]xyz = zip(x, y,
- 一、引言属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算
- 对于个人用户来说,除了病毒和木马,网页中的隐形代码也开始严重地威胁着我们的安全,但大多数人却缺乏自我保护意识,对隐形代码的危害认识不够,甚至
- 1. 非 matlab v7.3 files 读写import scipy.io as sioimport numpy# matFile 读
- 目录1. python内置方法(read、readline、readlines)2. 内置模块(csv)3. 使用numpy库(loadtx
- Docker用于开发Docker不仅用于部署,它还可以用于开发。1、为什么要在开发中使用Docker主要有以下几个原因。 1)一致的开发环境
- 一、提要python的@property是python的一种装饰器,是用来修饰方法的。python @property 装饰器使一个方法可以
- 以下是服务端代码var HTTPREQUEST_PROXYSETTING_DEFAULT = 0;var&nb
- 本文实例讲述了Python PyAutoGUI模块控制鼠标和键盘实现自动化任务。分享给大家供大家参考,具体如下:PyAutoGUI是用Pyt
- 最近在做一个站点时,需要生成静态页面,但是生成的静态页面中有些内容是需要动态获取的,怎不能每天生成一下吧。。 最后上网查了一下,再加上个要总
- 前言最近使用Python解析IDX文件格式的MNIST数据集,需要对二进制文件进行读取操作,其中我使用的是struct模块。查了网上挺多教程
- 将int转换成datetime格式原始时间格式users['timestamp_first_active'].head()原
- 【添加事件机制】 addEventListener 和 attachEvent[W3C]addEvent