python+opencv-13 分水岭算法实现图像分割

图像分割

图像分割是一种基本的图像处理技术,是指将图像分成不同特性的区域,并对目标进行提取的技术,它是由图像处理到图像分析的关键步骤。
目标提取和图像理解都是在图像分割的基础上进行的。

分水岭算法

分水岭算法会把临近像素间的相似性作为重要的参考因素,在空间位置上相近和灰度值相近的像素点互相连接起来构成一个封闭的区域。
可以把灰度图与地形图做对比。灰度值低的地方是山谷,灰度值高的地方是山峰。这样山峰包围了山谷,也天然的形成了分割线。
在真实的图像中,由于噪声的存在,会使很多局部极小值存在,使用分水岭算法常常存在过度分割的现象。为了解决过度分割的问题,可以使用基于标记图像的分水岭算法。通过标记来定义一些灰度层级,在该区域从这个灰度层级开始,这样就去除了一些很小的噪声极值。

OpenCV中的相关函数

形态性函数

形态学处理是对分水岭算法所使用的图像进行预处理,去除一些不必要的影响。比如开运算是县腐蚀后膨胀,可以去除图像内的噪声。

距离变换函数

如果图像内的子图独立出现,可以直接使用腐蚀操作确定前景对象,如果子图连接在一起,可以借助距离变换函数cv.distanceTransform()提取图像的前景。距离变换函数计算二值图像内任意点到最近背景点的距离。该函数计算的是非零像素点到最近的零值像素点的距离。对上述计算结果进行阈值化处理,就可以得到图像内子图的一些形状信息。
使用距离变换函数确定一幅图像的前景图:

import numpy as np
import cv2 as cv

image = cv.imread("bi.jpg", 0)
ret1, thresh = cv.threshold(image, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)

kernel = np.ones((3, 3), np.uint8)

imageopen = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2)

distTransform = cv.distanceTransform(imageopen, cv.DIST_L2, 5)
ret2, fore = cv.threshold(distTransform, 0.4*distTransform.max(), 255, 0)

cv.imshow("imageGray", image)
cv.imshow("imageOpen", imageopen)
cv.imshow("distTransform", distTr
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值