Opencv(二)—图像分割之分水岭算法

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 做图像处理时,我们可能会遇到一个问题:我们只需要图片的一部分区域,如何把图片中的某部分区域提取出来 或者 图像想要的区域用某种颜色(与其它区域颜色不一致)标记起来 ,以上描述的问题在像处理领域称为 图像分割

图像处理时,我们可能会遇到一个问题:我们只需要图片的一部分区域,如何把图片中的某部分区域提取出来 或者 图像想要的区域用某种颜色(与其它区域颜色不一致)标记起来 ,以上描述的问题在像处理领域称为 图像分割


说了这么多,可能还是有读者不知所云,这里我在下面放置了一张图,就是图像分割的一个应用,图像的前后对比,可以看到 人物 通过算法被很清晰地分割了出来,方便后续物体的识别跟踪。

这篇文章给大家介绍的就是 Opencv 中的一种图像分割方法 — 分水岭算法,先介绍一下这个算法所用到的基本原理:


把图像比喻成一个平面,图像灰度值高的区域被看作山峰,灰度值低的地方被看作山谷,不同区域的山谷我们可以用不同颜色来标记,但是随着标记区域不断扩大,会出现一种现象:不同山谷的交汇处区域会出现颜色错乱现象,为了防止这一现象的出现,要做的就是把高峰变得更高(改变灰度值),然后再用颜色标记,如此反复最后完成所所有山谷的颜色分割,以上就是 涉及分水岭算法基本原理。


说的简单一点,就是根据图像相邻的像素插值,分成不同区域;分水岭算法就是将不同区域染成不同颜色;分水岭分割算法最大的特征就是 区域的封闭性;


Opencv 包中的分水岭算法利用的不是原算法,而是在原算法基础上又改进了一下,加了一步预处理(因为原算法经常会造成图像过度分割):在分割之前先要设置那些山谷会出现汇合,那些不会;如果我i们能够确定该点代表的是要分割的对象,那么就用某个颜色或者灰度值标签标记它,如果不是就利用另一种颜色去标记它。随后的过程就是分水岭算法。当所有山谷区域都分割完毕之后,得到的边界对象值设置为 -1;


本次算法用到的图片实例

分水岭算法的具体使用步骤:

首先利用 cv2 读取图片,把 图片转变为灰质图,然后做阈值筛选,之前提到过的Otsu ’ s 二值化 ,变成下面的二值图片(两色图),至于如何二值化的,可以参照之前写的这篇文章:;代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt
import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('F:/opencv_test/1.jpg')
gray2 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(gray2,cv2.COLOR_RGB2GRAY)
# Otsu ' s 二值化;
ret,thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV +cv2.THRESH_OTSU)
plt.subplot(1,3,1),
plt.imshow(gray2),
plt.title('Original')
plt.subplot(1,3,3),
plt.imshow(thresh),
plt.title("Otsu's")

现在我们的目标就转化为提取图像中上面的白色区域:这里需要记住的是 这里硬币区域的是前景,也就是里硬币中心区域越近前景的可能性越大,离硬币区域中心越远的为背景的可能性越大 ,模糊区域就是前景与背景之间的边缘区域 ;


提取硬币区域,目前比较有效的有两种操作:腐蚀 操作和 膨胀 操作,腐蚀是用来去除边缘像素,而膨胀操作是将硬币边缘区域向外延申,对于操作之后的区域我们就能确定哪个区域一定是前景( Foreground ),哪个区域一定是背景( Background ).


代码部分:

#nosing removoal迭代两次
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations = 2)
# sure background area
sure_bg = cv2.dilate(opening,kernel,iterations = 3)
dist_transform = cv2.distanceTransform(opening,1,5)
ret,sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
sure_fg = np.uint8(sure_fg)
unknow = cv2.subtract(sure_bg,sure_fg)
plt.subplot(1,3,1),
plt.imshow(sure_bg),
plt.title('Black region\n must be background')
plt.subplot(1,3,3),
plt.imshow(unknow),
plt.title('Yellos region\n must be foregroun'),

网络异常,图片无法展示
|

确定的背景区域减去一定确定的前景区域就是我们所要的硬币区域 ;分水岭算法在这里应用就是处理前景和背景的交界处,经过区域相减、阈值化处理之后得到肯定是硬币的区域,接下来需要我们创建标签(与源图像大小相同,数据类型为 int32 );


利用 cv2.connectedComponents() 把不同区域的颜色分为不同颜色,把背景标记为0(也就是代码中的unkbow区域),最后就是进行分水岭算法,把不同的区域赋予不同的颜色

#Marker labeling
ret,makers1 = cv2.connectedComponents(sure_fg)
#Add one to all labels so that sure background is not 0 but 1;
markers = makers1 +1
#Now mark the region of unknow with zero;
markers[unknow ==255] =0
markers3 = cv2.watershed(img1,markers)

上面提到,不同区域的边界,在进行分水岭分割算法之后都被赋值为 -1;把区域为 -1 的区域用红色表示,就能非常清楚地看到分界线了:

img1[markers3 == -1] =[255,0,0]
plt.subplot(1,3,1),
plt.imshow(makers1),
plt.title('makers1')
plt.subplot(1,3,2),
plt.imshow(markers3),
plt.title('markers3')
plt.subplot(1,3,3),
plt.imshow(img1),
plt.title('img1'),

最后的分割展示效果展示如下:

相关文章
|
3月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
827 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
4月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
71 4
|
2月前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
4月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
5月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
5月前
|
计算机视觉 C++
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
这篇文章介绍了基于HSV颜色空间的图像分割原理,包括HSV模型的基本概念和如何在OpenCV中通过设置HSV的色彩范围来实现图像中特定颜色的物体分割,并通过示例代码展示了在静态图像和视频流中进行颜色分割的方法。
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
|
3月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
114 0
WK
|
5月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
170 1
|
5月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
937 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
7月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
270 1

热门文章

最新文章