精华内容
下载资源
问答
  • 分水岭算法分割图像

    2014-10-30 15:32:56
    分水岭算法进行图像分割,借鉴形态学理论,将一幅图看成拓扑性地图,其中灰度值对应地形高度。
  • 分水岭算法中会用到一个重要的概念——测地线距离。测地线距离(Geodesic Distance)测地线距离就是地球表面两点之间的最短路径(可执行路径)的距离,在图论中,Geodesic Distance 就是图中两节点的最短路径的距离,...

    分水岭(Watershed)是基于地理形态的分析的图像分割算法,模仿地理结构(比如山川、沟壑,盆地)来实现对不同物体的分类。

    分水岭算法中会用到一个重要的概念——测地线距离。

    测地线距离(Geodesic Distance)

    测地线距离就是地球表面两点之间的最短路径(可执行路径)的距离,在图论中,Geodesic Distance 就是图中两节点的最短路径的距离,这与平时在几何空间通常用到的 Euclidean Distance(欧氏距离),即两点之间的最短距离有所区别。

    在下图中,两个黑点的 Euclidean Distance 是用虚线所表示的线段的长度

    ,而 Geodesic Distance 作为实际路径的最短距离,其距离应为沿途实线段距离之和的最小值,即

    5243e49c3eac21e64974226f8ba8e943.png
    图1

    在三维曲面空间中两点间的测地距离就是两点间沿着三维曲面的表面走的最短路径。

    分水岭算法

    图像的灰度空间很像地球表面的整个地理结构,每个像素的灰度值代表高度。其中的灰度值较大的像素连成的线可以看做山脊,也就是分水岭。其中的水就是用于二值化的gray threshold level,二值化阈值可以理解为水平面,比水平面低的区域会被淹没,刚开始用水填充每个孤立的山谷(局部最小值)。

    当水平面上升到一定高度时,水就会溢出当前山谷,可以通过在分水岭上修大坝,从而避免两个山谷的水汇集,这样图像就被分成2个像素集,一个是被水淹没的山谷像素集,一个是分水岭线像素集。最终这些大坝形成的线就对整个图像进行了分区,实现对图像的分割。

    c18182669d74a1f8708bb100c8d9b59d.png
    图2

    在该算法中,空间上相邻并且灰度值相近的像素被划分为一个区域。

    分水岭算法的整个过程:

    1. 把梯度图像中的所有像素按照灰度值进行分类,并设定一个测地距离阈值。
    2. 找到灰度值最小的像素点(默认标记为灰度值最低点),让threshold从最小值开始增长,这些点为起始点。
    3. 水平面在增长的过程中,会碰到周围的邻域像素,测量这些像素到起始点(灰度值最低点)的测地距离,如果小于设定阈值,则将这些像素淹没,否则在这些像素上设置大坝,这样就对这些邻域像素进行了分类。

    fb5dd94e868d27b5c1c265ee04df96dd.png
    图3

    4. 随着水平面越来越高,会设置更多更高的大坝,直到灰度值的最大值,所有区域都在分水岭线上相遇,这些大坝就对整个图像像素的进行了分区。

    整个过程可以查看下面这个动图:

    02a829b00c8ab462d6cda59564d72419.png
    图4

    用上面的算法对图像进行分水岭运算,由于噪声点或其它因素的干扰,可能会得到密密麻麻的小区域,即图像被分得太细(over-segmented,过度分割),这因为图像中有非常多的局部极小值点,每个点都会自成一个小区域。

    其中的解决方法:

    1. 对图像进行高斯平滑操作,抹除很多小的最小值,这些小分区就会合并。
    2. 不从最小值开始增长,可以将相对较高的灰度值像素作为起始点(需要用户手动标记),从标记处开始进行淹没,则很多小区域都会被合并为一个区域,这被称为基于图像标记(mark)的分水岭算法

    下面三个图分别是原图,分水岭过分割的图以及基于标记的分水岭算法得到的图:

    a9a4ea1a3a9961193e658064c62638ca.png
    图5

    其中标记的每个点就相当于分水岭中的注水点,从这些点开始注水使得水平面上升,但是如上图所示,图像中需要分割的区域太多了,手动标记太麻烦,我们可是使用距离转换的方法进行标记,OpenCV中就是使用的这种方法。

    OpenCV中分水岭算法

    在OpenCV中,我们需要给不同区域贴上不同的标签。用大于1的整数表示我们确定为前景或对象的区域,用1表示我们确定为背景或非对象的区域,最后用0表示我们无法确定的区域。然后应用分水岭算法,我们的标记图像将被更新,更新后的标记图像的边界像素值为-1。

    下面对相互接触的硬币应用距离变换和分水岭分割。

    9369e657ce25de12bc739af722ca6af5.png
    图6

    先使用 Otsu's 二值化对图像进行二值化。

    import cv2
    import numpy as np
    
    img = cv2.imread('coins.png')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

    e17a2841bba7b49373d6857de2fe337a.png
    图7

    先使用开运算去除图像中的细小白色噪点,然后通过腐蚀运算移除边界像素,得到的图像中的白色区域肯定是真实前景,即靠近硬币中心的区域(下面左边的图);膨胀运算使得一部分背景成为了物体到的边界,得到的图像中的黑色区域肯定是真实背景,即远离硬币的区域(下面中间的图)。

    剩下的区域(硬币的边界附近)还不能确定是前景还是背景。可通过膨胀图减去腐蚀图得到,下图中的白色部分为不确定区域(下面右边的图)。

    # noise removal
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
    
    sure_bg = cv2.dilate(opening, kernel, iterations=2)  # sure background area
    sure_fg = cv2.erode(opening, kernel, iterations=2)  # sure foreground area
    unknown = cv2.subtract(sure_bg, sure_fg)  # unknown area

    99023cfbc8d6639919d9cf029ce4f6cb.png
    图8

    剩下的区域不确定是硬币还是背景,这些区域通常在前景和背景接触的区域(或者两个不同硬币接触的区域),我们称之为边界。通过分水岭算法应该能找到确定的边界。

    由于硬币之间彼此接触,我们使用另一个确定前景的方法,就是带阈值的距离变换

    下面左边的图为得到的距离转换图像,其中每个像素的值为其到最近的背景像素(灰度值为0)的距离,可以看到硬币的中心像素值最大(中心离背景像素最远)。对其进行二值处理就得到了分离的前景图(下面中间的图),白色区域肯定是硬币区域,而且还相互分离,下面右边的图为之前的膨胀图减去中间这个表示前景的图。

    # Perform the distance transform algorithm
    dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
    # Normalize the distance image for range = {0.0, 1.0}
    cv2.normalize(dist_transform, dist_transform, 0, 1.0, cv2.NORM_MINMAX)
    
    # Finding sure foreground area
    ret, sure_fg = cv2.threshold(dist_transform, 0.5*dist_transform.max(), 255, 0)
    
    # Finding unknown region
    sure_fg = np.uint8(sure_fg)
    unknown = cv2.subtract(sure_bg,sure_fg)

    827faf8c91e1becada5d9c0579a9a6be.png
    图9

    现在我们可以确定哪些是硬币区域,哪些是背景区域。然后创建标记(marker,它是一个与原始图像大小相同的矩阵,int32数据类型),表示其中的每个区域。分水岭算法将标记的0的区域视为不确定区域,将标记为1的区域视为背景区域,将标记大于1的正整数表示我们想得到的前景。

    我们可以使用 cv2.connectedComponents() 来实现这个功能,它是用0标记图像的背景,用大于0的整数标记其他对象。所以我们需要对其进行加一,用1来标记图像的背景。

    cv2.connectedComponents() 将传入图像中的白色区域视为组件(前景)。

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

    注意:得到的markers矩阵的元素类型为 int32,要使用 imshow() 进行显示,需要将其转换为 uint8 类型( markers=np.uint8(markers) )。

    我们对得到的markers进行显示:

    markers_copy = markers.copy()
    markers_copy[markers==0] = 150  # 灰色表示背景
    markers_copy[markers==1] = 0    # 黑色表示背景
    markers_copy[markers>1] = 255   # 白色表示前景
    
    markers_copy = np.uint8(markers_copy)

    4c0ed83f6ec1bfe3344cb2c306275c39.png
    图10

    标记图像已经完成了,最后应用分水岭算法。然后标记图像将被修改,边界区域将被标记为-1。

    # 使用分水岭算法执行基于标记的图像分割,将图像中的对象与背景分离
    markers = cv2.watershed(img, markers)
    img[markers==-1] = [0,0,255]  # 将边界标记为红色

    经过分水岭算法得到的新的标记图像和分割后的图像如下图所示:

    5d34333d9826d1cb28d22b4eae1d43d4.png
    图11

    任何两个相邻连接的组件不一定被分水岭边界(-1的像素)分开;例如在传递给 watershed 函数的初始标记图像中的物体相互接触。

    总结

    我们通过一个例子介绍了分水岭算法的整个过程,主要分为以下几步:

    1. 对图进行灰度化和二值化得到二值图像
    2. 通过膨胀得到确定的背景区域,通过距离转换得到确定的前景区域,剩余部分为不确定区域
    3. 对确定的前景图像进行连接组件处理,得到标记图像
    4. 根据标记图像对原图像应用分水岭算法,更新标记图像

    参考:

    OpenCV Watershed Algorithm

    IMAGE SEGMENTATION AND MATHEMATICAL MORPHOLOGY

    Classic Watershed

    基于标记的分水岭分割算法/OpenCV中距离变换

    剪刀手/分水岭分割法

    The Watershed Transform

    对扑克牌应用分水岭的例子

    展开全文
  • 分水岭算法中会用到一个重要的概念——测地线距离。测地线距离(Geodesic Distance)测地线距离就是地球表面两点之间的最短路径(可执行路径)的距离,在图论中,Geodesic Distance 就是图中两节点的最短路径的距离,...

    2acacec64a31b396fd413ec52eeec0a9.png

    分水岭(Watershed)是基于地理形态的分析的图像分割算法,模仿地理结构(比如山川、沟壑,盆地)来实现对不同物体的分类。

    分水岭算法中会用到一个重要的概念——测地线距离。

    测地线距离(Geodesic Distance)

    测地线距离就是地球表面两点之间的最短路径(可执行路径)的距离,在图论中,Geodesic Distance 就是图中两节点的最短路径的距离,这与平时在几何空间通常用到的 Euclidean Distance(欧氏距离),即两点之间的最短距离有所区别。

    在下图中,两个黑点的 Euclidean Distance 是用虚线所表示的线段的长度

    ,而 Geodesic Distance 作为实际路径的最短距离,其距离应为沿途实线段距离之和的最小值,即

    d7f456b7a00319b1a082e6c380a8a6b9.png
    图1

    在三维曲面空间中两点间的测地距离就是两点间沿着三维曲面的表面走的最短路径。

    分水岭算法

    图像的灰度空间很像地球表面的整个地理结构,每个像素的灰度值代表高度。其中的灰度值较大的像素连成的线可以看做山脊,也就是分水岭。其中的水就是用于二值化的gray threshold level,二值化阈值可以理解为水平面,比水平面低的区域会被淹没,刚开始用水填充每个孤立的山谷(局部最小值)。

    当水平面上升到一定高度时,水就会溢出当前山谷,可以通过在分水岭上修大坝,从而避免两个山谷的水汇集,这样图像就被分成2个像素集,一个是被水淹没的山谷像素集,一个是分水岭线像素集。最终这些大坝形成的线就对整个图像进行了分区,实现对图像的分割。

    f5c5df638bc47948b3e35397a86bdf87.png
    图2

    在该算法中,空间上相邻并且灰度值相近的像素被划分为一个区域。

    分水岭算法的整个过程:

    1. 把梯度图像中的所有像素按照灰度值进行分类,并设定一个测地距离阈值。
    2. 找到灰度值最小的像素点(默认标记为灰度值最低点),让threshold从最小值开始增长,这些点为起始点。
    3. 水平面在增长的过程中,会碰到周围的邻域像素,测量这些像素到起始点(灰度值最低点)的测地距离,如果小于设定阈值,则将这些像素淹没,否则在这些像素上设置大坝,这样就对这些邻域像素进行了分类。

    4fcd2c7a3b2df4f254ef7e632b5df8f7.png
    图3

    4. 随着水平面越来越高,会设置更多更高的大坝,直到灰度值的最大值,所有区域都在分水岭线上相遇,这些大坝就对整个图像像素的进行了分区。

    整个过程可以查看下面这个动图:

    2b3e67849ae6e3b36d3382b12f551b71.gif
    图4

    用上面的算法对图像进行分水岭运算,由于噪声点或其它因素的干扰,可能会得到密密麻麻的小区域,即图像被分得太细(over-segmented,过度分割),这因为图像中有非常多的局部极小值点,每个点都会自成一个小区域。

    其中的解决方法:

    1. 对图像进行高斯平滑操作,抹除很多小的最小值,这些小分区就会合并。
    2. 不从最小值开始增长,可以将相对较高的灰度值像素作为起始点(需要用户手动标记),从标记处开始进行淹没,则很多小区域都会被合并为一个区域,这被称为基于图像标记(mark)的分水岭算法

    下面三个图分别是原图,分水岭过分割的图以及基于标记的分水岭算法得到的图:

    db8d7bea56b8e796b5fd24fb1eb32c5a.png
    图5

    其中标记的每个点就相当于分水岭中的注水点,从这些点开始注水使得水平面上升,但是如上图所示,图像中需要分割的区域太多了,手动标记太麻烦,我们可是使用距离转换的方法进行标记,OpenCV中就是使用的这种方法。

    OpenCV中分水岭算法

    在OpenCV中,我们需要给不同区域贴上不同的标签。用大于1的整数表示我们确定为前景或对象的区域,用1表示我们确定为背景或非对象的区域,最后用0表示我们无法确定的区域。然后应用分水岭算法,我们的标记图像将被更新,更新后的标记图像的边界像素值为-1。

    下面对相互接触的硬币应用距离变换和分水岭分割。

    5aad4bcf7bfdad80e5f519348d0a1783.png
    图6

    先使用 Otsu's 二值化对图像进行二值化。

    import 

    cdf17e086741aff9a99c1822b6962899.png
    图7

    先使用开运算去除图像中的细小白色噪点,然后通过腐蚀运算移除边界像素,得到的图像中的白色区域肯定是真实前景,即靠近硬币中心的区域(下面左边的图);膨胀运算使得一部分背景成为了物体到的边界,得到的图像中的黑色区域肯定是真实背景,即远离硬币的区域(下面中间的图)。

    剩下的区域(硬币的边界附近)还不能确定是前景还是背景。可通过膨胀图减去腐蚀图得到,下图中的白色部分为不确定区域(下面右边的图)。

    # noise removal
    

    d00cc0b65959be7277a709eac04023d6.png
    图8

    剩下的区域不确定是硬币还是背景,这些区域通常在前景和背景接触的区域(或者两个不同硬币接触的区域),我们称之为边界。通过分水岭算法应该能找到确定的边界。

    由于硬币之间彼此接触,我们使用另一个确定前景的方法,就是带阈值的距离变换

    下面左边的图为得到的距离转换图像,其中每个像素的值为其到最近的背景像素(灰度值为0)的距离,可以看到硬币的中心像素值最大(中心离背景像素最远)。对其进行二值处理就得到了分离的前景图(下面中间的图),白色区域肯定是硬币区域,而且还相互分离,下面右边的图为之前的膨胀图减去中间这个表示前景的图。

    # Perform the distance transform algorithm
    

    82fce0235a64a5ca7360038f68b88e28.png
    图9

    现在我们可以确定哪些是硬币区域,哪些是背景区域。然后创建标记(marker,它是一个与原始图像大小相同的矩阵,int32数据类型),表示其中的每个区域。分水岭算法将标记的0的区域视为不确定区域,将标记为1的区域视为背景区域,将标记大于1的正整数表示我们想得到的前景。

    我们可以使用 cv2.connectedComponents() 来实现这个功能,它是用0标记图像的背景,用大于0的整数标记其他对象。所以我们需要对其进行加一,用1来标记图像的背景。

    cv2.connectedComponents() 将传入图像中的白色区域视为组件(前景)。

    # Marker labelling
    

    注意:得到的markers矩阵的元素类型为 int32,要使用 imshow() 进行显示,需要将其转换为 uint8 类型( markers=np.uint8(markers) )。

    我们对得到的markers进行显示:

    markers_copy 

    34054790a6e055f64792f6192bcdf4f0.png
    图10

    标记图像已经完成了,最后应用分水岭算法。然后标记图像将被修改,边界区域将被标记为-1。

    # 使用分水岭算法执行基于标记的图像分割,将图像中的对象与背景分离
    

    经过分水岭算法得到的新的标记图像和分割后的图像如下图所示:

    a4de26335bdf49f54892b9b46e217c8b.png
    图11

    任何两个相邻连接的组件不一定被分水岭边界(-1的像素)分开;例如在传递给 watershed 函数的初始标记图像中的物体相互接触。

    总结

    我们通过一个例子介绍了分水岭算法的整个过程,主要分为以下几步:

    1. 对图进行灰度化和二值化得到二值图像
    2. 通过膨胀得到确定的背景区域,通过距离转换得到确定的前景区域,剩余部分为不确定区域
    3. 对确定的前景图像进行连接组件处理,得到标记图像
    4. 根据标记图像对原图像应用分水岭算法,更新标记图像

    参考:

    OpenCV Watershed Algorithm

    IMAGE SEGMENTATION AND MATHEMATICAL MORPHOLOGY

    Classic Watershed

    基于标记的分水岭分割算法/OpenCV中距离变换

    剪刀手/分水岭分割法

    The Watershed Transform

    对扑克牌应用分水岭的例子


    如果觉得有用,点个赞吧(ง •̀_•́)ง。

    展开全文
  • 1. 分水岭分割方法它是依赖于形态学的,图像的灰度等级不一样,如果图像的灰度等级一样的情况下怎么人为的把它造成不一样?可以通过距离变换实现,这样它们的灰度值就有了阶梯状的变换。风水岭算法常见的有三种方法...

    4f71529e806fe8e57c60c46f18fbc4f4.png

    1. 分水岭分割方法

    它是依赖于形态学的,图像的灰度等级不一样,如果图像的灰度等级一样的情况下怎么人为的把它造成不一样?可以通过距离变换实现,这样它们的灰度值就有了阶梯状的变换。风水岭算法常见的有三种方法:(1)基于浸泡理论的分水岭分割方法;(2)基于连通图方法;(3)基于距离变换的方法。OpenCV 中是基于距离变换的分割方法,就相当于我们的小山头(认为造成的)。

    基本的步骤:

    2d5d5bf800e671b2d0178c8df5ff92f5.png

    例子1 粘连对象分离和计数。

    例子代码:

    #include

    效果:

    9d6ddff30ed50e6fbc62b8160d3a9296.png

    总结:有时候会导致碎片化,过度分割,因为二值化中如果有很多小的黑点或碎片,在分割的时候导致很多 mask ,即小山头太多了,这个时候我们要考虑怎么去合并它,可以通过联通区域的直方图,或者像素值均值相似程度等。

    例子2:图像分割

    #include

    效果图:

    bdf15e8b5af15a83a30524a8f2c1656c.png

    2. GrabCut 算法分割图像

    GrabCut 算法的原理前面有介绍过,这里就不在介绍了,具体可以看下文章末尾往期推荐中阅读。下面例子实现图像中对象的抠图。

    基本步骤:

    c2f8f35646b692e9417cc7803c9009d7.png

    例子代码:

    #include

    效果图:

    9d475493888807f3bb02d020bc1f404c.png

    3f0d7988e9ee3d5d3c46eb6d44fbe3d7.png

    欢迎关注我的微信公众号“OpenCV图像处理算法”,主要是记录自己学习图像处理算法的历程,包括特征提取、目标跟踪、定位、机器学习和深度学习,每一个例子都会提供源码和例子所用的资料,欢迎同行的同学关注我和我一起虚度光阴吧!!!

    展开全文
  • 形态学分水岭算法多数的图像分割算法均是基于灰度值的不连续和相似的性质。在前者中,算法以灰度突变为基础分割一幅图像,如图像边缘分割。假设图像不同区域的边界彼此完全不同,且与背景不同,从而允许基于灰度的...

    击上方新机器视觉”,选择加"星标"或“置顶”

    重磅干货,第一时间送达1a7013db977b21949dcdcb9cd0a25b44.png

    数字图像处理中常用图像分割算法有哪些?

    1.多数的图像分割算法

    2.图像边缘分割

    3.图像阈值分割

    4.基于区域的分割

    5.形态学分水岭算法

    多数的图像分割算法 均是基于灰度值的不连续相似的性质。在前者中,算法以灰度突变为基础分割一幅图像,如图像边缘分割。假设图像不同区域的边界彼此完全不同,且与背景不同,从而允许基于灰度的局部不连续性来进行边界检测。后者是根据一组预定义的准则将一幅图像分割为相似区域,如阈值处理、区域生长、区域分裂区域聚合都是基于这种方法形成的。下面将对每类算法进行详细说明。

    5838fbd68bbb6375e8669226bd90543d.png

    图像边缘分割:边缘是图像中灰度突变像素的集合,一般用微分进行检测。基本的边缘检测算法有:Roberts算子、Prewitt算子、Sobel算子。稍高级的算法有:Marr-Hilderth边缘检测器、Canny边缘检测器。

    cb5871bf8405212265566f9593aeee34.png

    图像阈值分割:由于阈值处理直观、实现简单且计算速度快,因此阈值处理在分割应用中处于核心地位。阈值处理可以分为单阈值处理与多阈值处理。在单阈值处理中最常用且分割效果也不错的算法是Otsu(最大类间方差算法)算法。多阈值处理:K类由K-1个阈值来分离,即计算图像的多个类间方差,多阈值处理的分割结果相较于单阈值的结果虽然会更好一些,但分类数量增加时它会开始失去意义,因为我们仅仅处理一个变量(灰度),此时可以通过增加变量如彩色来进行解决。

    cd7af8f64c1b198a088685e4be4a509e.png

    基于区域的分割:区域生长算法和区域分裂与聚合都是属于基于区域的分割算法。

    区域生长算法是根据预先定义的生长准则将像素或子区域组合为更大的区域的过程。

    基本方法是从一组“种子”点开始,将与种子预先定义的性质相似的那些邻域像素添加到每个种子上来形成这些生长区域(如特定范围的灰度或颜色)。区域分裂与聚合是首先将一幅图像细分为一组任意的不相交区域,然后按照一定规则聚合、分裂这些区域。

    形态学分水岭算法:分水岭的概念是以三维形象化一幅图像为基础的。

    在图中,我们主要考虑三种类型的点:

    (1)属于一个区域最小值的点;

    (2)把一点看成是一个水滴,如果把这些点放在任意位置上,水滴一定会下落到一个单一的最小值点;

    (3)处在该点的水会等可能性地流向不止一个这样的最小值点。

    对于一个特定的区域最小值,满足条件(2)的点的集合称为该最小值的汇水盆地分水岭

    满足条件(3)的点形成地表面的峰线,称之为分割线分水线

    为了达到更好的分割效果,常常将分水岭算法应用到梯度图像上,而不是图像本身。

    09f883586794f4b8a76c5b763c92f96a.png

    (二)

    个人认为图像分割的算法可以从分割目标入手:通常是要将图像分成目标区域和背景。

    需要从图像的特征入手,以灰度图像为例(其余类型的图像处理均类似),图像图形很明显的特征有:

    图像灰度值特征、目标边界特征、纹理特征、形态学特征等等;

    还有一些基于这些特征所计算提取出的特征,比如信息熵、能量泛函等等。

    最为简单的就是灰度值特征了,一幅图中有时候目标区域与背景区域有很明显的亮度区别,基于这个认识,只要试图找到某个亮度的值,我们假设低于该值的认为是背景,高于该值的认为是目标。关于找这个值的算法就是阈值分割算法了,像OTSU、迭代法、最大熵法等等都是属于这一范畴。

    同时也可以注意到,在空域内,目标的边界是区分目标与背景的重要依据,因此区分边界也是一个重要的手段,通常边界点周围灰度值变化率很高,因此可以基于图像灰度梯度来识别。这就有一些sobel算子、canny算子等等方式,都是通过找到边界来确定目标区域背景的。

    在有些图像中,目标区域具有一定的连续性,基于区域连续性的一些方法像区域生长法、分水岭算法等(本人对这一块不是很熟悉)。

    另外,基于图像原始的特征进行提取获得“精炼”的二级特征,并据此分割也是一种好的方法。像SNAKE算法,该算法认为目标区域的边界是“外力”,内力共同作用的结果,因此当外力内力平衡时找到边界,基于这种平衡,提出了判断能量泛函最小的判断原则。此外,还有基于几何活动轮廓模型的水平集方法,该方法是借助于目标区域的几何度量参数,可以比较好的处理一些拓扑变化。

    除去经典的阈值分水岭分割算法外,有主动轮廓及衍生的水平集,图割及相关算法(例如GrabCut),交互式分割,以及Cosegmentation。

    所有分割算法的核心目的是解决目标区域语义合并难题。例如交互式分割,通过精准交互来解决该问题。Cosegmentation通过分割相同或相似目标来处理该问题。

    (三)

    (1)基于阈值的分割方法:可在各种颜色空间或不同通道中完成阈值、自适应阈值、

    (2)基于边缘的分割方法:各种边缘检测算子

    (3)基于区域的分割方法:分水岭、区域归并与分裂

    (4)图割分割:最大流(最小割)算法

    (5)基于深度信息的分割

    (6)基于先验信息的分割

    基于特定理论的分割方法等。

    特定理论大概有:聚类分析、模糊集理论、基因编码、小波变换等。

    2e3ecd7117c4dbf74d399eb73040fdff.gif End 2e3ecd7117c4dbf74d399eb73040fdff.gif

    声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

    8e8869d6c99e111740af1a877c8af7b7.png

    展开全文
  • 图像分割算法有分水岭算法、斑点计数算法、霍夫圆/椭圆算法、轮廓检测算法等。在本文中,我使用了轮廓检测和分水岭算法。涉及的步骤:读取图像转换为HSV阈值模糊它删除多余/不需要的区域在原始图像上绘制轮廓使用...
  • 神经网络部分尚未收集整理。下面内容是从网上获取整理得出的,且都放了...主要分割方法有:基于阈值的分割基于边缘的分割基于区域的分割基于图论的分割基于能量泛函的分割基于阈值的分割方法参考:基于阈值的图像分...
  • # -*- coding: utf-8 -*- """ 图像分水岭分割图像 分水岭算法可以参考:http://baike.baidu.com/item/%E5%88%86%E6%B0%B4%E5%B2%AD%E7%AE%97%E6%B3%95 """ import numpy as np ...
  • 前面博文中提到的图像阈值化,...本篇博文介绍利用分水岭进行图像分割的方法。它是一种区域分割法,区域分割法利用图像的空间性质,以像素点之间的相似性为依据,根据不同的分割准则进行图像分割。这样能弥补阈值、...
  • ⚠️由于自己的拖延症,3.4.3翻到一半,OpenCV发布了4.0.0了正式版,所以接下来是按照4.0.0翻译的。...我们会学到使用分水岭算法来做基于标记的图像分割。 我们会遇到:cv.watershed() 原理 任何灰度图像都可以看...
  • 下面例子中,我们将用距离变换和分水岭算法对紧密连接在一起对象进行分割。 观察上图,硬币都紧密连接。即使你使用阈值,也无法把它们互相分割。 我们先从获得硬币的大致估计(approximate estimate)开始。 ...
  • OpenCV距离变换和分水岭算法图像分割距离变换和分水岭算法图像分割目标代码说明/结果 距离变换和分水岭算法图像分割 目标 在本教程中,您将学习如何: 使用OpenCV函数cv :: filter2D以便执行一些拉普拉斯滤波...
  • matlab实现分水岭算法处理图像分割

    千次阅读 2018-11-08 09:03:15
    matlab实现分水岭算法处理图像分割
  • matlab基于分水岭算法处理图像分割的源程序,其中有不同的方法,是我收集过来效果比较好的,有利于大家的学习交流
  • Halcon 分水岭算法图像分割
  • 分水岭算法进行图像分割 分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域...
  • opencv图像处理基础总结,基于分水岭算法图像分割,介绍了分水岭算法的原理、距离变换、opencv有关函数的用法,基于距离的分水岭分割的流程,python代码实现分水岭算法图像分割
  • 形态学分水岭算法图像分割中应用,房国志,徐建东,图像分割图像处理领域中重要的研究内容。本文将基于极小值技术的形态学分水岭算法应用于图像分割中,克服传统分水岭的过分割
  • 利用分水岭算法进行图像分割matlab实现 1’原理 分水岭算法图像看成“地形图”,灰度值大的对应山峰,灰度值小的对应集水盆,集水盆边界即为分水岭。 在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸...
  • 图像处理:分水岭算法图像分割分水岭算法 分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点: 极...
  • 分水岭原理讲解 浅显易懂 图像分割定义 分割原理 分水岭算法 标记约束分水岭算法 等级分割
  • 1)分水岭算法 原理: 任何一幅灰度图像都可以...我们需要在水汇合的地方构建起堤坝,不停的灌水,不停的构建堤坝直到所有的山峰都被水淹没,我们构建好的堤坝就是对图像分割,这就是分水岭算法的背后原理 对灰度
  • 使用VC编写的基于分水岭算法图像分割程序代码。
  • python+opencv-13 分水岭算法实现图像分割图像分割分水岭算法确定一幅图像的前景图像 图像分割 图像分割是一种基本的图像处理技术,是指将图像分成不同特性的区域,并对目标进行提取的技术,它是由图像处理到图像...
  • Opencv 分水岭算法用于图像分割

    千次阅读 2017-05-26 11:36:06
    • 使用分水岭算法基于掩模的图像分割 • 学习函数: cv2.watershed()
  • 代码实现: f=imread('C:\Users\lenovo\... % 读入图像 figure,imshow(f); % 显示原始图像 title('原始图像'); bw=imbinarize(f,graythresh(f)); % 转换为黑白二值图像 figure; imshow(bw); title('二值图像')...
  • 分水岭算法实现图像分割于提取

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 995
精华内容 398
关键字:

分水岭算法分割图像