Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象

news/2024/9/22 13:43:20

本文将介绍如何使用分水岭算法对触摸和重叠的图像中的对象进行分割和提取。
参考:https://www.pyimagesearch.com/2015/11/02/watershed-opencv/
在这里插入图片描述在这里插入图片描述分水岭算法是一种分割的经典算法,在提取图像中连接或重叠的图像中的对象(例如上图中的硬币)时特别有用。 使用传统的图像处理方法(例如阈值检测和轮廓检测),我们将无法从图像中提取每个硬币–但是,利用分水岭算法,我们能够准确地检测和提取每个硬币。

简单阀值和边缘轮廓检测很强大,但对于图片中有重叠和互相接触的对象,简单阀值和轮廓检测将无能为力。

简单阀值和边缘轮廓检测结果如下所示:
在这里插入图片描述硬币数量对不上,也不准确。

要应用分水岭算法,我们需要定义与图像中的对象相对应的标记。这些标记可以是用户定义的,也可以应用图像处理技术(例如阈值)为我们找到标记。
在应用分水岭算法时,获取准确的标记至关重要。
给定标记,我们可以计算欧几里得距离变换并将距离图传递给分水岭函数本身,该分水岭函数从初始标记开始并向外移动,从而“淹没”距离图中的山谷。在分割过程中,水的“池”相遇的地方可以视为边界线。 分水岭算法的输出是一组标签,其中每个标签对应于图像中的唯一对象。从那里开始,我们要做的就是分别遍历每个标签并提取每个对象。

# import the necessary packages
from skimage.feature import peak_local_max
from skimage.morphology import watershed
from scipy import ndimage
import numpy as np
import argparse
import imutils
import cv2# 我们已成功检测到图像中的所有九个硬币。此外,我们还能够清晰地绘制每个硬币周围的边界。这与使用简单阈值检测和轮廓检测的先前示例形成了鲜明对比,在先前示例中,仅(错误地)检测到两个对象。image = cv2.imread('D:/pyimagesearch/images/coin4.jpg')
# 应用金字塔均值漂移滤波 以提高阈值设置步骤的准确性  【金字塔均值偏移滤波可以看做是对彩色图像平滑颜色的一种操作】
shifted = cv2.pyrMeanShiftFiltering(image, 21, 51)
cv2.imshow("Input", image)# 将经过金字塔均值偏移滤波处理的图像 读取为灰度图像
# 应用Otsu的阈值将背景从前景中分割出来:
gray = cv2.cvtColor(shifted, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv2.imshow("Thresh", thresh)# 分割的第一步:通过distance_transform_edt计算欧几里德距离变换(EDT Euclidean distance)功能 此函数为每个前景像素计算最接近零的欧几里得距离(即背景像素)。
D = ndimage.distance_transform_edt(thresh)
# 在距离图中找到峰值(即局部最大值)。我们将确保每个峰之间的距离至少为20像素。采用peak_local_max的输出功能,并使用8连接性应用连接组件分析。
localMax = peak_local_max(D, indices=False, min_distance=20,labels=thresh)# 该函数的输出为我们提供了标记 然后我们将其馈入分水岭函数
# 分水岭算法  假设我们的标记代表我们的距离图中的局部最小值(即山谷),因此我们采用D的负值。
# 分水岭函数返回标签矩阵,一个NumPy数组,其宽度和高度与我们的输入图像相同。每个像素值作为唯一的标签值。具有相同标签值的像素属于同一对象。
markers = ndimage.label(localMax, structure=np.ones((3, 3)))[0]
labels = watershed(-D, markers, mask=thresh)
print("[INFO] {} unique segments found".format(len(np.unique(labels)) - 1))# 最后一步是简单地循环唯一标签值并提取每个唯一对象
# loop over the unique labels returned by the Watershed
# algorithm
for label in np.unique(labels):# label为0 默认为背景,忽略if label == 0:continue# 为我们的遮罩分配内存 并将属于当前标签的像素设置为255(白色)。mask = np.zeros(gray.shape, dtype="uint8")mask[labels == label] = 255# 检测到遮罩中的轮廓   并提取最大的轮廓-该轮廓将代表图像中给定对象的轮廓/边界。cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)c = max(cnts, key=cv2.contourArea)# 绘制围绕对象的包围圆边界。我们还可以计算对象的边界框,应用按位运算,并提取每个单独的对象。((x, y), r) = cv2.minEnclosingCircle(c)cv2.circle(image, (int(x), int(y)), int(r), (0, 255, 0), 2)cv2.putText(image, "#{}".format(label), (int(x) - 10, int(y)),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
# show the output image
cv2.imshow("Output", image)
cv2.waitKey(0)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu18.04上安装TensorFlow2.0

推特上几乎每天都有关于深度学习中Keras、TensorFlow哪个个才是最好的框架的口水战。2019年后,这将不在是个问题。 2019年初,tf.keras 子模块已引入TensorFlow v1.10.0中。 现在,在TensorFlow 2.0中,Keras是TensorFlow的官方高级A…

docker 镜像容器导入导出、查看日志、拷贝文件命令

1. 本地文件拷贝到docker 容器中,参考 docker cp /root/pcl-pcl-1.8.1.tar.gz 7ff95b333e12:/docker cp /root/lib64_a 7ff95b333e12:/2. docker从容器里面拷文件到宿主机 docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 d…

h5 video视频播放的同时加水印,图片加水印同样的原理

经常能看到播放视频的网站上加水印的效果,记录下成果以备后续看: 效果图如下: h5页面视频播放的同时加水印,有以下3种方法可尝试: 在原视频上添加,由于每次登陆的用户不一样,需要根据用户名动态确定水印的文本值。这并不现实;捕捉视频的每一帧,重新画在画布上,并添…

使用Python、OpenCV计算轮廓的中心

1. 使用Python、OpenCV计算轮廓的中心并标记 2. 使用Python、OpenCV检测轮廓的形状并标记 3. 使用颜色通道统计信息来标记形状的实际颜色并标记 本博客的目标:(1)检测图像中每个形状的轮廓,然后(2)计算轮廓的中心-也称为质心。 计算轮廓/形状区域的中心;仅使用轮廓属…

使用Python,OpenCV读取视频文件流/摄像头流的每一帧,修改后写入视频

使用OpenCV 3将视频写入文件,并保存在自己的磁盘上 尝试支持avi、MP4文件格式的写入,俩种文件的编码格式不一致 codec: MJPG output: example.avi codec: MP4V output: baby.mp4 但是,如果您尝试在自己的应用程序中将视频编写为使用OpenCV归档…

Enterprise Architect 中文经典教程

一、Enterprise Architect简介Enterprise Architect是一个对于软件系统开发有着极好支持的CASE软件(Computer Aided Software Engineering)。EA不同于普通的UML画图工具(如VISIO),它将支撑系统开发的全过程。在需求分析…

Python,OpenCV应用轮廓逼近算法,检测对象的形状

上一篇博客,我们学习了如何利用Python、OpenCV计算轮廓的中心,这一节学习仅运用轮廓的基本属性来检测其形状,三角形,正方形,矩形,五边形,圆。 (1)利用轮廓逼近&#xff0…

使用python,dlib,OpenCV提取眼睛,鼻子,嘴唇及下颌

使用python,dlib,OpenCV提取眼睛,鼻子,嘴唇及下颌 1. 效果图2. 原理3. 源码参考上一篇博客中,我们了解了什么是面部标志,以及如何使用dlib,OpenCV和Python检测它们。利用dlib的HOG SVM的形状预测器获得面部ROI中面部区域的68个点(x,y)坐标。 这一篇博客中,将演示如何…