【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法

OpenCV 例程200篇 总目录-202205更新

【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法
【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法


【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法


7. 图像分割之分水岭算法

分水岭算法是一种图像区域分割法,以临近像素间的相似性作为重要特征,从而将空间位置相近且灰度值相近的像素点互相连接起来,构成一个封闭的轮廓。

分水岭算法是基于形态学的图像分割方法,体现了边缘检测、阈值处理和区域提取的概念和思想,往往会产生更稳定的分割结果。算法的实现过程可以理解为洪水淹没的过程:最低点首先被淹没,然后水逐渐淹没整个山谷;水位升高到一定高度就会溢出,于是在溢出位置修建堤坝;不断提高水位,重复上述过程,直到所有的点全部被淹没;所建立的一系列堤坝就成为分隔各个盆地的分水岭。

分水岭的计算过程是一个迭代标注过程,通过寻找集水盆和分水岭对图像进行分割。经典的分水岭算法分为排序过程和淹没过程两个步骤,首先对每个像素的灰度级从低到高排序,然后在从低到高的淹没过程中,对每一个局部极小值在 h 阶高度的影响域进行判断及标注。

OpenCV 提供了函数 cv.watershed 实现基于标记的分水岭算法。

使用函数 cv.watershed 需要输入一个CV_32S 类型的标记图像,图像中每个非零像素代表一个标签。对图像中部分像素做标记,表明它的所属区域是已知的。

cv.watershed(image, markers[, ]	) → markers 

参数说明:

  • image:输入图像,8-bit/3-channel 彩色图像
  • markers:标记图像,32-bit 单通道图像,大小与 image 相同

注意事项:

  • 分水岭算法要求必须在标记图像 markers 中用索引勾勒出需要分割的区域,每个区域被赋值为 1、2、3… 等索引编号,对应于不同的目标物体。
  • 图像标记 markers 中未知区域的像素值设置为 0,通过分水岭算法确定这些像素属于背景还是前景区域。
  • 输出的图像标记 markers 中,每个像素都被赋值为 1、2、3… 等索引编号,或以 -1 表示区域之间的边界(分水岭)。

OpenCV 提供了函数 cv.distanceTransform 实现距离变换,计算图像中每个像素到最近的零像素点的距离。

函数说明:

cv.distanceTransform(src, distanceType, maskSize[, dst=None, dstType=CV_32F]) → dst
cv.distanceTransformWithLabels(src, distanceType, maskSize[, dst=None, labels=None, labelType=DIST_LABEL_CCOMP]) → dst, labels

参数说明:

  • src:输入图像,8-bit 单通道灰度图像
  • distanceType:距离的类型
    • cv.DIST_USER:用户定义的距离
    • cv.DIST_L1:dist=∣x1−x2∣+∣y1−y2∣dist = |x1-x2|+|y1-y2|dist=x1x2+y1y2
    • cv.DIST_L2:欧几里德距离
    • cv.DIST_C:dist=max(∣x1−x2∣,∣y1−y2∣)dist = max(|x1-x2|, |y1-y2|)dist=max(x1x2,y1y2)
  • maskSize:距离变换遮罩的大小,通常取 3, 5
  • labelType:生成的标签数组的类型
    • cv.DIST_LABEL_CCOMP:每个连接的零组件(及最接近连接组件的所有非零像素)被指定相同的标签
    • cv.DIST_LABEL_PIXEL:每个零像素(及离它最近的所有非零像素)都有自己的标签
  • dst:计算距离的输出图像,8-bit 或 32-bit 单通道图像,大小与 src 相同
  • labels:标签的输出图像,CV_32SC1类型, 大小与 src 相同

例程 11.40 基于轮廓标记的分水岭算法

基于标记的分水岭算法的思想是利用先验知识来帮助分割。本例程先用梯度算子进行边缘检测,然后通过查找图像轮廓,生成标记图像来引导分割。

基于轮廓标记的分水岭算法的步骤为:

(1)对图像进行梯度处理获得梯度图像;
(2)对梯度图像查找和绘制轮廓;
(3)基于轮廓图像生成标记图像;
(4)基于标记图像使用分水岭算法进行分割,得到各个分割目标的轮廓;
(5)把目标的轮廓添加到原始图像上;
(6)用随机颜色填充分割图像。

    # 11.40 基于轮廓标记图像的分水岭算法img = cv2.imread("../images/imgLena.tif", flags=1)  # 读取彩色图像(BGR)# img = cv2.imread("../images/imgTina.png", flags=1)  # 读取彩色图像(BGR)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图像# 查找和绘制图像轮廓Gauss = cv2.GaussianBlur(gray, (5,5), sigmaX=4.0)grad = cv2.Canny(Gauss, 50, 150)  # Canny 梯度算子# grad = cv2.Canny(gray, 80, 150)  # Canny 梯度算子grad, contours, hierarchy = cv2.findContours(grad, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 查找图像轮廓markers = np.zeros(img.shape[:2], np.int32)  # 生成标识图像,所有轮廓区域标识为索引号 (index)for index in range(len(contours)):  # 用轮廓的索引号 index 标识轮廓区域markers = cv2.drawContours(markers, contours, index, (index, index, index), 1, 8, hierarchy)ContoursMarkers = np.zeros(img.shape[:2], np.uint8)ContoursMarkers[markers>0] = 255  # 轮廓图像,将所有轮廓区域标识为白色 (255)# 分水岭算法markers = cv2.watershed(img, markers)  # 分水岭算法,所有轮廓的像素点被标注为 -1WatershedMarkers = cv2.convertScaleAbs(markers)# 用随机颜色填充分割图像bgrMarkers = np.zeros_like(img)for i in range(len(contours)):  # 用随机颜色进行填充colorKind = [np.random.randint(0, 255), np.random.randint(0, 255), np.random.randint(0, 255)]bgrMarkers[markers==i] = colorKindbgrFilled = cv2.addWeighted(img, 0.67, bgrMarkers, 0.33, 0)  # 填充后与原始图像融合print(len(contours))plt.figure(figsize=(10, 6))plt.subplot(231), plt.axis('off'), plt.title("Origin image")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)plt.subplot(232), plt.axis('off'), plt.title("Gradient")plt.imshow(grad, 'gray')  # Canny 梯度算子plt.subplot(233), plt.axis('off'), plt.title("Contours markers")plt.imshow(ContoursMarkers, 'gray')  # 轮廓plt.subplot(234), plt.axis('off'), plt.title("Watershed markers")plt.imshow(WatershedMarkers, 'gray')  # 确定背景plt.subplot(235), plt.axis('off'), plt.title("Color Markers")plt.imshow(cv2.cvtColor(bgrMarkers, cv2.COLOR_BGR2RGB))plt.subplot(236), plt.axis('off'), plt.title("Cutted image")plt.imshow(cv2.cvtColor(bgrFilled, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述



(本节完)


版权声明:

OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124813571)

Copyright 2022 youcans, XUPT
Crated:2022-5-15


欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法
【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法
【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

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

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

相关文章

【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔 6. 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割、图像压缩和机器视觉。 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列…

【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔 图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割、图像压缩和机器视觉。 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步…

【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常&…

整型和浮点型之间的转化

在Java中,我们如何将整型转化为浮点型,或者我们如何将浮点型转化成整型的呢? 结果演示 代码演示 package com.ten;public class Zidongzh {public static void main(String[] args) {double a 127.0;float b(float)a;float c(float)b;int…

【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通…

【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征…

中奖程序

使用Java做了一个中奖程序,程序中已经设置中奖的号码,根据文本提示会让你输入四个数字,当你输入你的四个数字之后程序会给出你是否中奖的结果显示。 结果演示 代码演示 package com.ten; import java.util.Scanner; public class ZhongJi…

【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合 两张图像直接进行加法运算后图像的颜色会改变,通过加权加法实现图像混合后图像的透明度会改变,都不能实现图像的叠加。 实现图像的叠加,需要…

【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合 拉普拉斯金字塔将源图像分解到不同的频带,越高频的图像信息越到上层。在相同显示尺寸下比较不同分辨率的拉普拉斯图像,可以发现不同尺度下关注的细…

【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状 6.5 Gabor 滤波器 Gabor 变换是一种加窗短时傅里叶变换,以高斯函数作为短时傅里叶变换的窗函数,因此可以在频域不同尺度、不同方向上提取特征。 Gabor 函…

【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取 6.5 Gabor 滤波器 Gabor 变换是一种加窗短时傅里叶变换,以高斯函数作为短时傅里叶变换的窗函数,因此可以在频域不同尺度、不同方向上提取特征。 G…

MyEclipse生成常用方法

我们使用Eclipse工具开发的时候,有很多的代码我们是不用写的,我们可以直接生成我们想要的方法,那么怎么生成我们经常使用的方法呢??? 首先打开我们的MyEclipse工具 到代码编辑页面,在已经定义好…

【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours)

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours) 1. 轮廓 轮廓是一系列相连的像素点组成的曲线,代表了物体的基本外形。轮廓常用于形状分析和物体的检测和识别。 边缘检测根据灰度的…

java线程池执行器_Java线程池ThreadPoolExecutor的使用

Java线程池ThreadPoolExecutor的使用ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口。Excutor接口只定义了一个方法就是execute用来执行任务。ExecutorService继承于Excutor并添加了一些其他的执行任务的方法和管理线程…

密码强度显示

使用HTML,CSS及JS实现注册功能中密码强度的显示&#xff0c;根据输入的密码判断并显示用户输入密码的强度等级是高还是低等。 效果演示 代码演示 html内容 <div class"container"><div class"userName-wrapper"><label for"userN…

【youcans 的 OpenCV 例程200篇】195.绘制图像轮廓(cv.drawContours)

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】195.绘制图像轮廓&#xff08;cv.drawContours&#xff09; 1. 轮廓 轮廓是一系列相连的像素点组成的曲线&#xff0c;代表了物体的基本外形。轮廓常用于形状分析和物体的检测和识别。 边缘检测根据灰度的…

【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征

OpenCV 例程200篇 总目录-202205更新 文章目录【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征2. 轮廓的特征描述2.2 轮廓的面积、周长、质心和近似多边形2.2.1 轮廓的面积2.2.2 轮廓的周长2.2.3 轮廓的质心2.2.4 轮廓的近似2.2.5 轮廓的凸包&#xff08;凸壳&#xff09;例…

Idea 项目导入

我们在刚开始使用新的开发工具IDEA的时候会遇到我们想要导入一个外部项目却不知从何下手&#xff0c;下面我就教给大家如何使用IDEA导入一个外部的项目。 Idea 导入 外部项目 1.点击 file — new 2.打开路径地址&#xff0c;选择需要导入的项目 3.选择创建—next 4.默认—…

【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测

OpenCV 例程200篇 总目录-202206更新 【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测 3. 基于不变矩检测的图像识别 形状匹配也称为形状相似度检测&#xff0c;用于比较两个形状或两个轮廓。 函数 cv2.matchShapes() 基于 Hu 不变矩检测两个形状之间的相似度…