已解决
python opencv之图像分割、计算面积
来自网友在路上 177877提问 提问时间:2023-11-02 01:35:42阅读次数: 77
最佳答案 问答题库778位专家为你答疑解惑
以下代码是一个基于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()
几个问题,供读者思考:
-
为什么选择K-means聚类算法?
-
为什么是聚7类?
-
这种方法具有通用性吗,换其他类似图片也提取准确吗?
-
还有更好的方法吗,如果目标的轮廓更加复杂,该怎么处理?
-
已经算出了图上面积,怎么计算实际面积?
查看全文
99%的人还看了
相似问题
- C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]
- 基于像素特征的kmeas聚类的图像分割方案
- UE5像素流送详细教程,以及解决黑边和鼠标消失问题
- OpenCV快速入门:像素操作和图像变换
- OpenCV中的像素重映射原理及实战分析
- 世界坐标系,相机坐标系,像素坐标系转换 详细说明(附代码)
- React动态生成二维码和毫米(mm)单位转像素(px)单位
- UE5.0.3版本 像素流送 Pixel Streaming
- python:逐像素处理遥感数据时间序列数据(求时间序列最大值、最大值所对应的索引、最大值所在的时间)
- 经典文献阅读之--RLAD(城市环境中自动驾驶从像素进行强化学习)
猜你感兴趣
版权申明
本文"python opencv之图像分割、计算面积":http://eshow365.cn/6-29782-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 目标检测与图像识别分类的区别?
- 下一篇: 配置vue 环境