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
0
投稿
猜你喜欢
- 当数据库服务器建立好以后,我们首先要做的不是考虑要在这个支持数据库的服务器运行哪些受MySQL提携的程序,而是当数据库遭到破坏后,怎样安然恢
- 下面就是解决方案: 1- From the command prompt, stop isqlplus: c:\>isqlplusct
- detectres.asp<HTML><head><TITLE>asp教程之全能屏幕分辨率侦测</
- 我们经常会遇到多重查询问题,而长长的SQL语句往往让人丈二和尚摸不着头脑。特别是客户端部分填入查询条件时,如用普通方法将更是难上加难。以下巧
- 在大型商业应用中,数据的异地容灾备份十分重要,也必不可少。笔者根据自己的实践经验,设计了一套简洁地实现异地数据自动备份的方法,可供数据库管理
- 如何用我的国际域名做虚拟域名?config.asp<%Domain_URL = "intels.net&
- 当一个页面上有一百个表单项,你是怎么获取上面的值勤的?这是一段简单的代码,你试试这段代码,试过后,欢迎留言说一下你的想法?index.asp
- 当然有其它工具可以做这件事,但如果客户不允许你在服务器乱装东西时这个脚本就会有用了。 代码如下:DECLARE @tbImportTable
- 如何避免磁盘临时表因为内存储引擎不支持TEXT和BLOB数据类型, 使用到BLOB和TEXT列的查询和使用隐式临时表的查询将不得不使用MyI
- 今天在做sql Server 2005的实验的时候碰到的问题,问题描述很清楚,怀疑是我以前给计算机修改了名称而导致的.可以用select @
- 今天,在完成一个小的python习题,习题的主要内容是读取一个帮助模块,并保存到本地文件。知道是用pydoc进行模块的读取,但是在windo
- 翻译:ShiningRay简介你是否知道JavaScript其实也是一个函数式编程语言呢?本指南将教你如何利用JavaScript的函数式特
- 在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范
- creatdoc.asp<!DOCTYPE HTML PUBLIC "-//W3C/DTD&n
- 1.指向“开始->程序->Microsoft SQL Server 2005->配置工具->SQL Server 外
- 工厂模式(Factory Pattern)是什么工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会
- [Hack] 意为”劈”、”砍”。 [Hacker] 意为”黑客”CSS Hack 是指针对不同的浏览器写不同的CSS code的过程,简单
- 主要利用了XMLHTTP的一些方法和属性来获取服务器的信息。 以下是全部源代码: &
- 问:SQL Server应该怎样访问Sybase数据库的表?答:具体方法如下:1: 安装Sybase客户端版本的要求:Sybase Clie
- 1. RequestDispatcher.forward()在服务器端起作用,当使用forward()时,Servlet engine传递H