python opencv之图像分割、计算面积

以下代码是一个基于K-means聚类算法进行图像分割的实现。通过读取一个彩色图像,将其转化为二维数组形式。然后使用K-means算法对像素点进行聚类,聚类个数为7。根据聚类后的标签值对像素点进行着色,并创建掩膜图像。接着使用形态学开运算和闭运算去掉周围的绿色点和填充区域内部空隙,找到最大的轮廓并计算其面积。最后再将最大轮廓绘制在原始图像上并显示出来。

import cv2
import numpy as np# 读取彩色图像
img = cv2.imread(r'C:\Users\Pictures\rm.png')# 将图像数据转换为二维数组形式
values = img.reshape((-1, 3))
values = np.float32(values)# K-Means聚类
K = 7
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
ret, label, center = cv2.kmeans(values, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)# 创建新图像并根据聚类标签对像素点着色
segmented_img = np.zeros_like(values)
# segmented_img[np.where(label==0)[0], :] = [255, 0, 0] # 给第0类像素点赋值蓝色
segmented_img[np.where(label==1)[0], :] = [0, 255, 0] # 给第1类像素点赋值绿色
# segmented_img[np.where(label==2)[0], :] = [0, 0, 255] # 给第2类像素点赋值红色
# segmented_img[np.where(label==3)[0], :] = [0, 0, 0] # 给第3类像素点赋值黑色
# segmented_img[np.where(label==4)[0], :] = [255, 255, 255] # 给第3类像素点赋值白色# 将分割后图像重新转化成与原图像相同的维度
segmented_img = segmented_img.reshape(img.shape)
# 创建掩膜图像
mask = np.zeros(segmented_img.shape[:2], dtype=np.uint8)
mask[np.where(np.all(segmented_img == [0, 255, 0], axis=-1))] = 255# 进行形态学开运算,去掉周围的绿色点
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)# 进行形态学闭运算,填充区域内部空隙
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)# 找到轮廓并获取最大轮廓及其面积
contours, _ = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# max_contour = max(contours, key=cv2.contourArea)
total_area = 0
for i, contour in enumerate(contours):# 计算轮廓面积area = cv2.contourArea(contour)total_area += area
# 绘制最大轮廓并显示在原图上
output = img.copy()
cv2.drawContours(output, contours, -1, (0, 255, 0), 2)
cv2.imshow('Contour', output)# 显示聚类结果
cv2.imshow('Image', img)
cv2.imshow('Segmented Image', segmented_img)
cv2.imshow('Mask', closing)
# 等待关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

图片

图片

图片

图片

几个问题,供读者思考:

  1. 为什么选择K-means聚类算法?

  2. 为什么是聚7类?

  3. 这种方法具有通用性吗,换其他类似图片也提取准确吗?

  4. 还有更好的方法吗,如果目标的轮廓更加复杂,该怎么处理?

  5. 已经算出了图上面积,怎么计算实际面积?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/152210.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VTK OrientationMarker 方向 三维坐标系 相机坐标轴 自定义坐标轴

本文 以 Python 语言开发 我们在做三维软件开发时,经常会用到相机坐标轴,来指示当前空间位置; 坐标轴效果: 相机方向坐标轴 Cube 正方体坐标轴 自定义坐标轴: Code: Axes def main():colors vtkNamedC…

IT行业变成了夕阳行业

IT技术发展背景及历程 从2010年左右开始,大众创新,万众创业变成了一个经常看到的词语,在创业潮的带动下,同时刚好赶上了互联网的高速发展,一大批互联网创业公司应运而生,在这样的背景下,IT行业…

设计模式——单例模式详解

目录 设计模式类型单例模式单例模式方式饿汉式静态常量方式静态代码块形式 懒汉式线程不安全(不推荐)懒汉式优化(不推荐) 双重检查(推荐方式)静态内部类(推荐方式)枚举方式&#xff…

Oracle (7)Online Redo Log Files

目录 一、Oracle Online Redo Log Files及其相关内容介绍 1、Online Redo Log Files简介 2、Online Redo Log Files特点 3、Online Redo Log Files文件组 4、多路复用文件 5、联机重做日志文件工作方式 6、LGWR什么时候写重做 7、LS和LSN 8、删除Redo文件成员 9、删除…

开始学习Go编程

探索Go编程中的语法、数据类型和控制流 Go,又称为Golang,因其简单性、性能和效率而广受欢迎。在本文中,我们将深入研究构成Go编程语言基础的基本概念。从理解其语法和数据类型到掌握控制流和函数,我们将为您提供启动Go编程之旅所…

Vue 3响应式对象: ref和reactive

目录 什么是响应式对象? Ref Reactive Ref vs Reactive 适用场景: 访问方式: 引用传递: 性能开销: 响应式对象优点 响应式对象缺点 总结 Vue 3作为一种流行的JavaScript框架,提供了响应式编程的…

高速下载b站视频的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

VR步进式漫游,轻松构建三维模型,带来展示新形式!

引言: 虚拟现实(Virtual Reality,简称VR)已经成为当今科技领域的一项创新力量,它正在逐渐渗透到不同的领域,其中步进式漫游是VR技术的一项重要应用,它能在各个行业的宣传中发挥重要作用。 一&a…

【开源】基于SpringBoot的海南旅游景点推荐系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

深度学习与计算机视觉(一)

文章目录 计算机视觉与图像处理的区别人工神经元感知机 - 分类任务Sigmoid神经元/对数几率回归对数损失/交叉熵损失函数梯度下降法- 极小化对数损失函数线性神经元/线性回归均方差损失函数-线性回归常用损失函数使用梯度下降法训练线性回归模型线性分类器多分类器的决策面 soft…

记录一次时序数据库的实战测试

0x1.前言 本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台。 0x2.背景 在某次Edus…

Redis(04)| 数据结构-压缩列表

压缩列表的最大特点,就是它被设计成一种内存紧凑型的数据结构,占用一块连续的内存空间,不仅可以利用 CPU 缓存,而且会针对不同长度的数据,进行相应编码,这种方法可以有效地节省内存开销。 但是,…