Python opencv图像处理基础总结(七) 基于分水岭算法的图像分割

简介: 任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,我们需要在水汇合的地方构建起堤坝。不停地灌水,不停地构建堤坝知道所有的山峰都被水淹没。我们构建好的堤坝就是对图像的分割

一、 原理


1. 分水岭算法原理


  • 任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,我们需要在水汇合的地方构建起堤坝。不停地灌水,不停地构建堤坝知道所有的山峰都被水淹没。我们构建好的堤坝就是对图像的分割,这就是分水岭算法的背后原理。
  • OpenCV采用了基于掩模的分水岭算法,在这种算法中我们要设置那些山谷点会汇合,那些不会。这是一种交互式的图像分割,我们要做的就是给我们已知的对象打上不同的标签。如果某个区域肯定是前景或对象,就使用某个颜色(或灰度值)标签标记它。如果某个区域肯定不是对象而是背景就使用另外一个颜色标签标记。而剩下的不能确定是前景还是背景的区域就用 0 标记,这就是我们的标签。然后实施分水岭算法。每一次灌水,我们的标签就会被更新,当两个不同颜色的标签相遇时就构建堤坝,直到将所有山峰淹没,最后我们得到的边界对象(堤坝)的值为 -1。


2. 距离变换


  • 距离变换的基本含义是计算一个图像中非零像素点到最近的零像素点的距离,也就是到零像素点的最短距离。
  • 最常见的距离变换算法就是通过连续的腐蚀操作来实现,腐蚀操作的停止条件是所有前景像素都被完全。
  • 腐蚀。这样根据腐蚀的先后顺序,我们就得到各个前景像素点到前景中心骨架像素点的距离。
  • 根据各个像素点的距离值,设置为不同的灰度值。这样就完成了二值图像的距离变换。


3. opencv有关函数的用法


cv2.distanceTransform(src, distanceType, maskSize, dst=None, dstType=None)


  • src:输入二值图像
  • distanceType:计算距离的方式
  • maskSize:蒙板尺寸


cv2.connectedComponents(image, labels=None, connectivity=None, ltype=None)


  • image:输入8位单通道图像
  • labels:输出标签地图
  • connectivity:连通性,默认8,还可以取4。
  • Itype:输出标签类型 ,默认 CV_32S, 还可以取CV_16U。


cv2.watershed(image, markers)


  • image:输入图像
  • markers:标记


二、基于距离的分水岭分割流程



  • 输入图像,有噪声的话,先进行去噪。
  • 转成灰度图像
  • 二值化处理、形态学操作
  • 距离变换
  • 寻找种子、生成marker
  • 实施分水岭算法、输出分割后的图像


三、python代码实现


# -*- coding: UTF-8 -*-"""@公众号      : AI庭云君@Author     : 叶庭云@CSDN       : https://yetingyun.blog.csdn.net/"""importcv2ascvimportnumpyasnpdefwatershed_algorithm(image):
# 边缘保留滤波EPF  去噪blur=cv.pyrMeanShiftFiltering(image,sp=10,sr=100)
# 转成灰度图像gray=cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
# 得到二值图像   自适应阈值ret, binary=cv.threshold(gray, 0, 255, cv.THRESH_BINARY|cv.THRESH_OTSU)
cv.imshow('binary image', binary)
# 形态学操作   获取结构元素  开操作kernel=cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
opening=cv.morphologyEx(binary, cv.MORPH_OPEN, kernel=kernel, iterations=2)
# 确定区域sure_bg=cv.dilate(opening, kernel, iterations=3)
# cv.imshow('mor-opt', sure_bg)# 距离变换dist=cv.distanceTransform(opening, cv.DIST_L2, 3)
dist_out=cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)
# cv.imshow('distance-', dist_out * 50)ret, surface=cv.threshold(dist_out, dist_out.max() *0.6, 255, cv.THRESH_BINARY)
# cv.imshow('surface-markers', surface)surface_fg=np.uint8(surface)    # 转成8位整型unkonown=cv.subtract(sure_bg, surface_fg)        # 找到位置区域# Marker labellingret, markers=cv.connectedComponents(surface_fg)  # 连通区域print(ret)
# 分水岭变换# Add one to all labels so that sure background is not 0, but 1markers=markers+1# Now, mark the region of unknown with zeromarkers[unkonown==255] =0# 实施分水岭算法了。标签图像将会被修改,边界区域的标记将变为 -1markers=cv.watershed(image, markers=markers)
image[markers==-1] = [0, 0, 255]      # 被标记的区域   设为红色cv.imshow('result', image)
src=cv.imread(r'./test/042.png')
src=cv.resize(src, None, fx=0.5, fy=0.5)
cv.imshow('input image', src)
watershed_algorithm(src)
cv.waitKey(0)
cv.destroyAllWindows()


运行效果如下:








目录
相关文章
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
655 20
|
11月前
|
人工智能 算法 计算机视觉
Python 图像处理技巧
本文介绍了Python图像处理中需要掌握的15个基本技能,涵盖图像读取与保存、颜色空间转换、裁剪与调整大小、滤波与平滑、边缘检测、阈值处理、形态学操作、直方图处理、特征检测与描述、图像配准与特征匹配、轮廓检测与分析、图像分割、模板匹配、透视变换与仿射变换以及傅里叶变换等内容。通过OpenCV、Pillow和Matplotlib等库实现相关功能,为图像处理提供了全面的基础指导。
286 0
|
机器学习/深度学习 人工智能 算法
Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。
【7月更文挑战第5天】Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。CV涉及图像处理、模式识别和机器学习,用于图像理解和生成。Python的跨平台特性和活跃社区使其成为CV的理想工具。基本流程包括图像获取、预处理、特征提取、分类识别及图像生成。例如,面部识别通过预处理图像,使用如`cv2.CascadeClassifier`进行检测;物体检测类似,但需适应不同目标;图像生成则利用GAN创造新图像。
311 4
|
监控 Java 计算机视觉
Python图像处理中的内存泄漏问题:原因、检测与解决方案
在Python图像处理中,内存泄漏是常见问题,尤其在处理大图像时。本文探讨了内存泄漏的原因(如大图像数据、循环引用、外部库使用等),并介绍了检测工具(如memory_profiler、objgraph、tracemalloc)和解决方法(如显式释放资源、避免循环引用、选择良好内存管理的库)。通过具体代码示例,帮助开发者有效应对内存泄漏挑战。
699 1
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
692 10
|
机器学习/深度学习 算法 数据可视化
Python的计算机视觉与图像处理
本文介绍了Python在计算机视觉和图像处理领域的应用,涵盖核心概念、算法原理、最佳实践及应用场景。重点讲解了OpenCV、NumPy、Pillow和Matplotlib等工具的使用,并通过代码实例展示了图像读写、处理和可视化的方法。实际应用包括自动驾驶、人脸识别、物体检测等。未来趋势涉及深度学习、边缘计算和量子计算,同时也讨论了数据不足、模型解释性和计算资源等挑战。
703 2
|
计算机视觉 开发者 Python
利用Python进行简单的图像处理
【10月更文挑战第36天】本文将引导读者理解如何使用Python编程语言和其强大的库,如PIL和OpenCV,进行图像处理。我们将从基本的图像操作开始,然后逐步深入到更复杂的技术,如滤波器和边缘检测。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供新的视角和技能,让你能够更好地理解和操作图像数据。
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
546 7
|
机器学习/深度学习 计算机视觉 Python
opencv环境搭建-python
本文介绍了如何在Python环境中安装OpenCV库及其相关扩展库,包括numpy和matplotlib,并提供了基础的图像读取和显示代码示例,同时强调了使用Python虚拟环境的重要性和基本操作。
|
计算机视觉 开发者 Python
使用Python进行简单图像处理
【8月更文挑战第31天】 本文将介绍如何使用Python编程语言来处理图像。我们将通过代码示例来展示如何读取、显示、编辑和保存图像文件。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供一个清晰的指引,帮助你开始自己的图像处理项目。

热门文章

最新文章

推荐镜像

更多
下一篇
开通oss服务