形态学处理_形态学处理的作用 - CSDN
精华内容
参与话题
  • 数字图像处理(一) ——形态学处理

    万次阅读 2018-09-12 15:01:54
    1 形态学基本操作 1.1 膨胀 膨胀:就是求局部最大值的操作。 按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积。 核可以是任何的形状和大小,它拥有...

    1 形态学基本操作

    1.1 膨胀

    膨胀:就是求局部最大值的操作。

    按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积。

    核可以是任何的形状和大小,它拥有一个单独定义出来的参考点,我们称其为锚点(anchorpoint)。多数情况下,核是一个小的中间带有参考点和实心正方形或者圆盘,其实,我们可以把核视为模板或者掩码。

    膨胀是求局部最大值的操作:核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。如下图所示,这就是膨胀操作的初衷。
    这里写图片描述

    膨胀的数学表达式:
    这里写图片描述

    膨胀效果:
    这里写图片描述

    1.2 腐蚀

    腐蚀:就是求局部最小值的操作。
    这里写图片描述
    腐蚀的数学表达式:
    这里写图片描述
    照片腐蚀效果图:
    这里写图片描述

    1.3 优点

    膨胀与腐蚀能实现多种多样的功能,主要如下:

    • 消除噪声
    • 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
    • 寻找图像中的明显的极大值区域或极小值区域
    • 求出图像的梯度

    2 形态学组合操作

    2.1 开运算(Opening Operation)

    开运算(Opening Operation),其实就是先腐蚀后膨胀的过程。其数学表达式如下:

    dist=open(src,element)=dilate(erode(src,element))

    开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。效果图是这样的:
    这里写图片描述

    2.2 形态学闭运算

    先膨胀后腐蚀的过程称为闭运算(Closing Operation),其数学表达式如下:

    dist=close(src,element)=erode(dilate(src,element))

    这里写图片描述

    作用:闭运算能够排除小型黑洞(黑色区域)

    2.3 形态学梯度

    形态学梯度就是膨胀图与腐蚀图之差,数学表达式:

    dist=morphgrad(src,element)=dilate(src,element)erode(src,element)

    这里写图片描述
    作用:对二值图像进行这一操作,可以将团块的边缘突出出来,我们可以用形态梯度来保留物体的边缘轮廓

    2.4 顶帽(top Hat)

    顶帽就是原图与开运算图之差,数学表达式:

    dist=tophat(src,element)=srcopen(src,element)

    因为开运算带来的结果是放大了裂痕或者局部低亮度的区域。因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作与选择的核的大小有关。
    这里写图片描述
    这里写图片描述

    2.5 黑帽(Black Hat)

    黑帽就是闭运算与原图之差,数学表达式:

    dist=blackhat(src,element)=close(src,element)src

    黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作与核的大小有关。

    黑帽运算用来分离比临近点暗一点的斑块,效果图有着非常完美的轮廓
    这里写图片描述

    参考

    [1]【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

    展开全文
  • 目录 1 形态学操作 2 图像腐蚀 3 图像膨胀 参考资料 1 形态学操作 ...形态学(morphology)一词通常表示生物学的一个分支,该分支...形态学处理主要针对的是二值图像(0或1)。 形态学通常使用图像腐蚀和图像膨胀...

    目录

    1 形态学操作

    2 图像腐蚀

    3 图像膨胀

    参考资料


    1 形态学操作

    形态学morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。这里,我们使用同一词语表示数学形态学的内容,将数学形态学作为工具从图像中提取表达和描绘区域形状的有用图像分量,如边界、骨架和凸壳等。

    形态学处理主要针对的是二值图像(0或1)。

    形态学通常使用图像腐蚀图像膨胀两个操作,这些操作是形态学处理的基础。


     

    2 图像腐蚀

    作为{{Z}^{2}}中的集合AB,表示为A\ominus BBA的腐蚀定义为:

                                                                                  A\ominus B=\left\{ z\left| {{(B)}_{z}}\subseteq A \right. \right\}

    上式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图所示,将左边的原始图像A腐蚀处理为右边的效果图A\ominus B

     

    图像腐蚀的效果如下图所示:

     

    图像腐蚀类似于“邻域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。其主要包括两个输入对象:

    (1) 二值图像

    (2 )卷积核

     

    卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,腐蚀的过程如下图所示:

    被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。换句话说,遍历到的黄色点位置,其周围全部是白色,保留白色,否则变为黑色,图像腐蚀变小。如下图所示:

     

    图像腐蚀主要使用的函数为 erode(),其函数形式如下:

    dst = cv2.erode(src, kernel, iterations)

    其中,参数:

    dst 表示处理的结果;

    src 表示原图像;

    kernel 表示卷积核;

    iterations 表示迭代次数。

    注:迭代次数默认是1,表示进行一次腐蚀,也可以根据需要进行多次迭代,进行多次腐蚀。

    例如:下图表示5\times5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

     

    (1)卷积核大小为5\times5 ,迭代次数为1

    代码如下所示:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((5,5), np.uint8)
    
    #图像腐蚀处理
    erosion = cv2.erode(src, kernel)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", erosion)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:

     

     

    (2)卷积核大小为5\times5,迭代次数为9

    代码如下所示:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((5,5), np.uint8)
    
    #图像腐蚀处理
    erosion = cv2.erode(src, kernel,iterations=10)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", erosion)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:

     

    (2)卷积核大小为39\times39,迭代次数为1

    代码如下所示:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread('test1.bmp', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((39,39), np.uint8)
    
    #图像腐蚀处理
    erosion = cv2.erode(src, kernel)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", erosion)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:

     


    3 图像膨胀

    作为{{Z}^{2}}中的集合AB,表示为A\oplus BBA膨胀定义为:

                                                                            A\oplus B=\left\{ z\left| {{(\widehat{B})}_{z}}\bigcap{A\ne \varnothing } \right. \right\}

    图像膨胀是腐蚀操作的逆操作,类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,线条变粗了,主要用于去噪。

    (1) 图像被腐蚀后,去除了噪声,但是会压缩图像。

    (2) 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。

    它也包括两个输入对象:

    (1)二值图像或原始图像

    (2)卷积核

    图像膨胀的效果如下图所示:

     

    卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

     

     

    被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则为0

     

    图像膨胀主要使用的函数为 dilate(),其函数用法如下所示:

    dst = cv2.dilate(src, kernel, iterations)

    其中,参数:

    dst 表示处理的结果;

    src 表示原始图像;

    kernel 表示卷积核;

    iterations 表示迭代次数。

    注:迭代次数默认是1,表示进行一次膨胀,也可根据需要进行多次迭代,进行多次膨胀。通常进行1次膨胀即可。

    例如,下图表示5\times5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

     

    (1)卷积核大小为3\times3 ,迭代次数为1

    代码如下所示:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread('test2.bmp', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((3,3), np.uint8)
    
    #图像膨胀处理
    erosion = cv2.dilate(src, kernel)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", erosion)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:

     

    (1)卷积核大小为5\times5 ,迭代次数为1

    代码如下所示:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread('test2.bmp', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((5,5), np.uint8)
    
    #图像膨胀处理
    erosion = cv2.dilate(src, kernel)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", erosion)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:

     


     

    参考资料

    [1] https://blog.csdn.net/Eastmount/article/details/83581277

    [2] Python+OpenCV图像处理

    展开全文
  • 形态学图像处理

    万次阅读 多人点赞 2016-12-31 16:17:01
    形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-...

    形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-most discriminative)的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。

    本文主要包括以下内容

    • 二值图像的基本形态学运算, 包括腐蚀、膨胀、开和闭。
    • 二值形态学的经典应用, 包括击中击不中变换、边界提取和跟踪、区域填充、提取连通分量、细化和像素化, 以及凸壳
    • 灰度图像的形态学运算, 包括灰度腐蚀、灰度膨胀、灰度开和灰度闭
    • 本章的典型案例分析
      • 在人脸局部图像中定位嘴的中心
      • 显微镜下图像的细菌计数
      • 利用顶帽变换(top-hat)技术解决光照不均问题

    预备知识
    在数字图像处理中, 形态学是借助集合论的语言来描述的, 本章后面的各节内容均以本集合论为基础。

    结构元素(structure element)
    设有两幅图像A, S。若A是被处理的对象, 而S是用来处理A的, 则称S为结构元素。结构元素通常都是一些比较小的图像, A与S的关系类似于滤波中图像和模板的关系.

    二值图像中的基本形态学运算

    本节介绍几种二值图像的基本形态学运算, 包括腐蚀、膨胀, 以及开、闭运算。由于所有形态学运算都是针对图像中的前景物体进行的, 因而首先对图像前景和背景的认定给出必要的说明.

    注意: 大多数图像,一般相对于背景而言物体的颜色(灰度)更深, 二值化之后物体会成为黑色, 而背景则成为白色, 因此我们通常是习惯于将物体用黑色(灰度值0)表示, 而背景用白色(灰度值255)表示,本章所有的算法示意图以及所有的Visual C++的程序实例都遵从这种约定;但Matlab 在二位图像形态学处理中,默认情况下白色的(二位图像中灰度值为1的像素,或灰度图像中灰度值为255的像素)
    是前景(物体),黑色的为背景, 因而本章涉及Matlab 的所有程序实例又都遵从Matlab本身的这种前景认定习惯.

    实际上, 无论以什么灰度值为前景和背景都只是一种处理上的习惯, 与形态学算法本身无关。例如对于上面两幅图片, 只需要在形态学处理之前先对图像反色就可以在两种认定习惯之间自由切换。

    腐蚀及其实现

    腐蚀和膨胀是两种最基本也是最重要的形态学运算, 它们是后续要介绍的很多高级形态学处理的基础, 很多其他的形态学算法都是由这两种基本运算复合而成

    matlab实现
    Matlab中与腐蚀相关的两个常用函数为imerode和strel。
    imerode函数用于完成图像腐蚀.其常用调用形式如下:I2 = imrode(I,SE)
    I为原始图像,可以是二位或灰度图像(对应于灰度腐蚀).
    SE是由strel函数返回的自定义或预设的结构元素对象.

    strel函数可以为各种常见形态学运算生成结构元素SE, 当生成供二值形态学使用的结构元素肘, 其调用形式为:SE=strl(shape,parameter)
    shape指定了结构元素的形状, 其常用合法取值如在8.1所示.

    腐蚀的作用“ 顾名思义,腐蚀能够消融物体的边界,而具体的腐蚀结果与图像本身和结构元素的形状有关。如果物体整体上大于结构元素,腐蚀的结构是使物体变“ 瘦”一圈,而
    这一圈到底有多大是由结构元素决定的:如果物体本身小于结构元素, 则在腐蚀后的图像中物体将完全消失:如物体仅有部分区域小于结构元素〈如细小的连通3,则腐蚀后物体会在细
    连通处断裂,分离为两部分。

    I = imread('erode_dilate.bmp');    
    se = strel('square',3);
    Ib = imerode(I,se);
    se = strel([0 1 0;1 1 1;0 1 0]);    
    Ic = imerode(I,se);
    se = strel('square',5);
    Id = imerode(I,se);
    
    figure;
    subplot(2,2,1);
    imshow(I);
    subplot(2,2,2);
    imshow(Ib);
    subplot(2,2,3);
    imshow(Ic);
    subplot(2,2,4);
    imshow(Id);

    随着腐蚀结构元素的逐步增大,小于结构元素的物体相继消失。由于腐蚀运算具有上述的特点,可以用于滤波。选择适当大小和形状的结构元素,可以滤除掉所有不能 完全包含结构元素的噪声点。然而,利用腐蚀滤除噪声有一个缺点,即在去除噪声点的同时,对图像中前景物体的形状也会有影响,但当我们只关心物体的位置或者个数时,则影响不大

    膨胀及其实现

    实际上, 膨胀和腐蚀对子集合求补和反射运算是彼此对偶的.
    这里值得注意的是定义中要求和A有公共交集的不是结构元素S本身, 而是S的反射集, 觉得熟悉吗?这在形式上似乎容易让我们回忆起卷积运算, 而腐蚀在形式上则更像相关运算。由于图8.8 中使用的是对称的结构元素, 故使用S 和S^' 的膨胀结果相同:但对于图8.9中非对称结构元素的膨胀示例, 则会产生完全不同的结果, 因此在实现膨胀运算时一定要先计算S^'

    matlab实现
    imdilate函数用于完成图像膨胀, 其常用调用形式如下:
    I2 = imdilate(I,SE);
    I为原始图像, 可以是二位或灰度图像(对应于灰度膨胀).
    SE是由strel函数返回的自定义或预设的结构元素对象

    膨胀的作用和腐蚀相反, 膨胀能使物体边界扩大, 具体的膨胀结果与图像本身和结构元素的形状有关。膨胀常用于将图像中原本断裂开来的同一物体桥接起来, 对图像进行二值化之后, 很容易使一个连通的物体断裂为两个部分, 而这会给后续的图像分析(如要基于连通区域的分析统计物体的个数〉造成困扰,此时就可借助膨胀桥接断裂的缝隙

    I = imread('starcraft.bmp');
    Ie1 = imerode(I,[1 1 1;1 1 1;1 1 1]);     
    Ie2 = imerode(Ie1,[0 1 0;1 1 1;0 1 0]); 
    Id1 = imdilate(Ie2,[1 1 1;1 1 1;1 1 1]);
    Id2 = imdilate(Id1,[0 1 0;1 1 1;0 1 0]);
    
    figure;
    subplot(2,2,1);
    imshow(Ie1);
    subplot(2,2,2);
    imshow(Ie2);
    subplot(2,2,3);
    imshow(Id1);
    subplot(2,2,4);
    imshow(Id2);

    开运算及其实现

    开运算和闭运算都由腐蚀和膨胀复合而成, 开运算是先腐蚀后膨胀, 而闭运算是先膨胀后腐蚀。

    一般来说, 开运算可以使图像的轮廓变得光滑, 还能使狭窄的连接断开和消除细毛刺。
    如图8.11所示, 开运算断开了团中两个小区域间两个像素宽的连接〈断开了狭窄连接〉,并且去除了右侧物体上部突出的一个小于结构元素的2×2的区域〈去除细小毛刺〉: 但与腐蚀不同的是, 图像大的轮廓并没有发生整体的收缩, 物体位置也没有发生任何变化。
    根据图8.12 的开运算示意图, 可以帮助大家更好地理解开运算的特点。为了比较, 图中也标示出了相应的腐蚀运算的结果:

    matlab实现
    根据定义,以相同的结构元素先后调用imerode和imdilate即可实现开操作。此外,Matlab 中也直接提供了开运算函数imopen, 其调用形式如下:
    I2 = imopen(I,SE);

    I = imread('erode_dilate.bmp');
    Io = imopen(I,ones(6,6));
    figure;
    subplot(1,2,1);
    imshow(I);
    subplot(1,2,2);
    imshow(Io);


    从图8.13中可以看到同腐蚀相比,开运算在过滤噪声的同时并没有对物体的形状、轮廓造成明显的影响,这是一大优势。但当我们只关心物体的位置或者个数时,物体形状的改变不会给我们带来困扰,此时用腐蚀滤波具有处理速度上的优势〈同开运算相比节省了一次膨胀运算〉。

    闭运算及其实现

    闭运算同样可以使轮廓变得光滑, 但与开运算相反, 它通常能够弥合狭窄的间断, 填充小的孔洞。

    Matlab实现
    根据定义,以相同的结构元素先后调用imdilate 和imerode 即可实现闭操作。此外,Matlab中也直接提供了闭运算函数imclose, 其用法同imopen 类似

    二值图像中的形态学应用

    击中与击不中交换及其实现

    I = zeros(120,180);
    I(11:80,16:75)=1;
    I(56:105,86:135)=1;
    I(26:55,141:170)=1;
    
    se = zeros(58,58);
    se(5:54,5:54)=1;
    
    Ie1 = imerode(I,se);
    Ic = 1 - I;
    S2 = 1 - se;
    Ie2 = imerode(Ic,S2);
    Ihm = Ie1&Ie2;
    
    figure;
    subplot(2,2,1);
    imshow(I);
    subplot(2,2,2);
    imshow(Ie1);
    subplot(2,2,3);
    imshow(Ie2);
    subplot(2,2,4);
    imshow(Ihm);


    图中给出了变换的最终结果。为便于观察在显示时每幅图像周围都环绕着一圈黑色边框, 注意该边框并不是图像本身的一部分。

    注意: 注意对于结构元素s,我们感兴趣的物体S1之外的背景S2不能选择得太宽,因为使得S包含背景S2的目的仅仅是定义出物体S1的外轮廓,以便在图像中能够
    找到准确的完全匹配位置. 从这个意义上说, 物体S1周围有一个像素宽的背景环绕就足够了, 例8.3中选择了4个像素宽的背景,是为了使结构元素背景部分应
    看起来比较明显, 但如果背景部分过大, 则会影响击中/击不中变换的计算结果.在上例中, 中间的正方形Y与右上的正方形Z之间的水平距离为6,如果在定义S时, S2的宽度超过6个像素, 则最终的计算结果将是空集.

    边界提取与跟踪及其实现

    轮廓是对物体形状的有力描述, 对图像分析和识别十分有用。通过边界提取算法可以得到物体的边界轮廓:而边界跟踪算法在提取边界的同时还能依次记录下边界像素的位置信息,下面分别介绍.

    边界提取
    要在二值图像中提取物体的边界,容易想到的一个方法是将所有物体内部的点删除(置为背景色〉。具体地说,可以逐行扫描原图像,如果发现一个黑点〈图8.17 中黑点为前景点)的8个邻域都是黑点, 则该点为内部点, 在目标图像中将它删除。实际上这相当于采用一个3*3的结构元素对原图像进行腐蚀, 使得只有那些8个邻域都有黑点的内部点被保留,再用原图像减去腐蚀后的图像, 恰好删除了这些内部点, 留下了边界像素。这一过程可参
    见图8.17 。

    I = imread('head_portrait.bmp');
    se = strel('square',3);
    Ie = imerode(I,se);
    Iout = I - Ie;
    figure;
    subplot(1,2,1);
    imshow(I);
    subplot(1,2,2);
    imshow(Iout);

    边界跟踪

    区域填充

    区域填充可视为边界提取的反过程, 它是在边界已知的情况下得到边界包围的整个区域的形态学技术。

    理论基础
    问题的描述如下: 己知某-8连通边界和边界内部的某个点, 要求从该点开始填充整个边界包围的区域, 这一过程称为种子填充, 填充的开始点被称为种子.
    如图8.20 所示, 对于4 连通的边界, 其围成的内部区域是8 连通的, 而8连通的边界围成的内部区域却是4连通的.

    为了填充4 连通的边界应选择图8.20 (b )中的3 × 3 结构元素, 但如果想在8 连通边界内从种子点得到区域则需选用图8.20 (d)的十字结构元素S 对初始时仅为种子点的图像B进行膨胀,十字结构元素S能够保证只要B在边界A的内部〈不包括边界本身〉,每次膨胀都不会产生边界之外的点(新膨胀出来的点或者在边界内部, 或者落在边界上〉, 这样只需把每次膨胀的结果图像和边界的补图像Ac相交, 就能把膨胀限制在边界内部。随着对B的
    不断膨胀, B的区域不断生长, 但每次膨胀后与Ac的交又将B限制在边界d的内部, 这样一直到最终B充满整个A的内部区域,停止生长。此时的B与d的并集即为最终的区域填充结果。

    连通分量提取及其实现

    连通分量的概念在0.3.1小节中曾介绍过。在二值图像中提取连通分量是许多自动图像分析应用中的核心任务。提取连通分量的过程实际上也是标注连通分量的过程, 通常的做法是给原图像中的每个连通区分配一个唯一代表该区域的编号, 在输出图像中该连通区内的所有像素的像素值就赋值为该区域的编号, 我们将这样的输出图像称为标注图像。

    matlab实现
    在Matlab中, 连通分量的相关操作主要借助IPT函数bwlabel实现. 其调用语法为
    [L num]= bwlabel(Ibw,conn);
    Ibw为一幅输入二位图像.
    conn为可选参数, 指明要提取的连通分量是4连边还是8连通, 默认值为8.
    L为类似于图8.23 ( b)的标注图像.
    num为二维图像Ibw中连通分量的个数.

    提取连通分量的应用十分广泛, 利用标注图像可以方便地进行很多基于连通区的操作。例如要计算某一连通分量的大小, 只需扫描一遍标注图像, 对像素值为该区编号的像素进行计数: 又如要计算某一连通分量的质心, 只需扫描一遍标注图像, 找出所有像素值为该区编号的像素的x、y坐标, 然后计算其平均值.

    在人脸局部图像中定位嘴的中心
    我们希望在如图8.24 (a )所示的图像中定位嘴的中心,假定已经掌握了输入图像中的某些先验知识,嘴部占据了图像的大部分区域且从灰度上易于与周围皮肤分离开来. 于是针
    对性地拟定了在二位化图像中寻找最大连通区域中心的解决方案, 具体步骤为:
    (1)对输入图像进行二位化处理.
    (2)标注二值图像中的连通分量.
    (3)找出最大的连通分量.
    (4)计算最大连通分量的中心.

    % locateMouth.m
    
    I = imread('mouth.bmp'); %读入图像
    Id = im2double(I);
    figure, imshow(Id) % 得到8.24(a)
    Ibw = im2bw(Id, 0.38); % 以0.38为阈值二值化
    Ibw = 1 - Ibw; %为在Matlab中进行处理,将图像反色
    figure, imshow(Ibw) % 得到8.24(b)
    hold on
    [L, num] = bwlabel(Ibw, 8); % 标注连通分量
    disp(['图中共有' num2str(num) '个连通分量'])
    
    % 找出最大的连通分量(嘴)
    max = 0; % 当前最大连通分量的大小
    indMax = 0; % 当前最大连通分量的索引
    for k = 1:num
        [y x] = find(L == k); % 找出编号为k的连通区的行索引集合y和列索引集合x
    
        nSize = length(y); %计算该连通区中的像素数目
        if(nSize > max)
            max = nSize;
            indMax = k;
        end
    end
    
    if indMax == 0
        disp('没有找到连通分量')
        return
    end
    
    % 计算并显示最大连通分量(嘴)的中心
    [y x] = find(L == indMax);
    yMean = mean(y);
    xMean = mean(x);
    plot(xMean, yMean, 'Marker', 'o', 'MarkerSize', 14, 'MarkerEdgeColor', 'w', 'MarkerFaceColor', 'w');
    plot(xMean, yMean, 'Marker', '*', 'MarkerSize', 12, 'MarkerEdgeColor', 'k'); % 得到8.24(c)

    细菌计数

    I = imread('bw_bacteria.bmp');
    [L,num]=bwlabel(I,8);
    Idil = imdilate(I,ones(3,3));
    [L,num] = bwlabel(Idil,8);
    
    figure;
    subplot(1,2,1);
    imshow(I);
    subplot(1,2,2);
    imshow(Idil);

    展开全文
  • 图像的形态学处理  数学形态学(Mathematical morphology)是一门 建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限...

    图像的形态学处理

            数学形态学(Mathematical morphology)是一门 建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。

            膨胀、腐蚀、开运算和闭运算是数学形态学的四个基本运算,它们在二值图像和灰度图像中各有特点。基于这些运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析和处理,包括图像分割、特征提取、边缘检测、图像滤波、图像增强和恢复等。有关数学形态学更多的介绍,可以查看百度词条:数学形态学

    (一)图像的膨胀和腐蚀

    定义结构元素是数学形态学处理的核心,在OpenCV中可以使用其自带的getStructuringElemet函数,也可以直接使用numpy数组来定义一个结构元素。

    先进行腐蚀操作

    img = cv2.imread('luotuo.jpg', 0)
    # 先对图像进行一个二值化处理
    ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    # 用numpy定义结构元素
    npKernel = np.uint8(np.zeros((5, 5)))
    for i in range(5):
        npKernel[2, i] = 1
        npKernel[i, 2] = 1
    print(npKernel)
    # 用OpenCV中的getStructuringElement()函数定义结构元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    # 进行腐蚀操作
    npKernel_eroded = cv2.erode(th2, npKernel)
    kernel_eroded = cv2.erode(th2, kernel)
    cv2.imshow('img', th2)
    cv2.imshow('npKernel Eroded Image', npKernel_eroded)
    cv2.imshow('kernel Eroded Image', kernel_eroded)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    [[0 0 1 0 0]
     [0 0 1 0 0]
     [1 1 1 1 1]
     [0 0 1 0 0]
     [0 0 1 0 0]]
    
    Process finished with exit code 0

    然后进行膨胀操作

    img = cv2.imread('4.jpg', 0)
    # 先对图像进行一个二值化处理
    ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    # 用numpy定义结构元素
    npKernel = np.uint8(np.zeros((5, 5)))
    for i in range(5):
        npKernel[2, i] = 1
        npKernel[i, 2] = 1
    # 用OpenCV中的getStructuringElement()函数定义结构元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    # 进行膨胀操作
    npKernel_dilated = cv2.dilate(th2, npKernel)
    kernel_dilated = cv2.dilate(th2, kernel)
    cv2.imshow('img', th2)
    cv2.imshow('npKernel Dilated Image', npKernel_dilated)
    cv2.imshow('kernel Dilated Image', kernel_dilated)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    关于图像的腐蚀和膨胀,就两个函数cv2.erode(),cv2.dilate(),都需要传入两个参数,一个是需要处理的二值化图像,第二个是结构元素,返回处理好的图像。

    (二)开运算

    开运算就是指图像先进行腐蚀再膨胀的运算,腐蚀可以使图像外的小点点去掉,再膨胀就可以去除掉图像外的噪声。

    # 开运算操作
    img = cv2.imread('luotuo.jpg', 0)
    ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
    for i in range(2000):  # 添加椒盐噪声
        _x = np.random.randint(0, th2.shape[0])
        _y = np.random.randint(0, th2.shape[1])
        th2[_x][_y] = 255
    kernel = np.ones((5, 5), np.uint8)
    erosion = cv2.morphologyEx(th2, cv2.MORPH_OPEN, kernel)  # 开运算函数
    cv2.imshow('th2', th2)
    cv2.imshow('morph_open', erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    从结果来看,骆驼之外的小白点全部填充为黑色了,去除骆驼之外的白色噪声。

    (三)闭运算

    与开运算相反,闭运算是指先进行膨胀运算再进行腐蚀运算,膨胀可以将图像内的小白点去掉,然后把主图像腐蚀回来,实现对图像内噪声的去除。

    # 闭运算
    img = cv2.imread('luotuo.jpg', 0)
    ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    for i in range(20000):  # 添加椒盐噪声
        _x = np.random.randint(0, th2.shape[0])
        _y = np.random.randint(0, th2.shape[1])
        th2[_x][_y] = 0
    kernel = np.ones((5, 5), np.uint8)
    erosion = cv2.morphologyEx(th2, cv2.MORPH_CLOSE, kernel)
    cv2.imshow('th2', th2)
    cv2.imshow('erosion', erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    重点:对图像的膨胀和腐蚀操作是对二值化后的白色图像区域的膨胀和腐蚀。

    (四)形态学梯度

    通过利用对图像的膨胀和腐蚀的组合使用,使得处理后的图像如同提取了物体的轮廓。

    # 形态学梯度
    img = cv2.imread('luotuo.jpg', 0)
    ret, th = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    kernel = np.ones((5, 5), np.uint8)
    # morphology  形态学
    gradient = cv2.morphologyEx(th, cv2.MORPH_GRADIENT, kernel)  # morph gradient 形态梯度
    cv2.imshow('th', th)
    cv2.imshow('gradient', gradient)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    (五)礼帽和黑帽

    礼帽指的是原始图像与其进行开运算后的图像进行一个差,对于差别之处显示其原有图色。

    # 礼帽
    img = cv2.imread('4.jpg', 0)
    ret, th = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    kernel = np.ones((5, 5), np.uint8)
    tophat = cv2.morphologyEx(th, cv2.MORPH_TOPHAT, kernel)
    cv2.imshow('th', th)
    cv2.imshow('tophat', tophat)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    黑帽指的是原始图像与其进行闭运算后的图像进行一个差,对于差别之处显示原有图色的反颜色。

    # 黑帽
    img = cv2.imread('4.jpg', 0)
    ret, th = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    kernel = np.ones((5, 5), np.uint8)
    blackhat = cv2.morphologyEx(th, cv2.MORPH_BLACKHAT, kernel)  # blackhat
    cv2.imshow('th', th)
    cv2.imshow('blackhat', blackhat)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    展开全文
  • 图像形态学处理(几个应用)

    千次阅读 2019-01-12 16:08:39
    #include"matrix.h" voidmain(void) {          grayimag A;     ...nb
  • opencv 形态学处理

    千次阅读 2018-04-06 10:11:35
    一、话说形态学图像形态学中的几个基本操作:腐蚀、膨胀、开操作、闭操作。1.1 腐蚀结构A被结构B腐蚀的定义为, A⨀B={z|(B)z⊆A}A⨀B={z|(B)z⊆A}可以理解为,移动结构B,如果结构B与结构A的交集完全属于结构A的...
  • 形态学处理

    2019-04-08 11:24:54
    形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们...
  • 结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小还很多。二维平面结构元素由一个数值为0或1的矩阵组成。结构元素的原点指定了图像中需要处理的像素范围,结构...
  • 图像形态学处理

    千次阅读 2019-07-12 11:02:17
    Matlab DIP(瓦)ch9形态学图像处理 本章的练习主要是形态学的一些基本概念和技术,这些构成了一组提取图像特征的有力工具,针对二值图像和灰度图像的腐蚀、膨胀和重构的基本操作可以组合使用,以执行非常宽泛的任务...
  • 图像的形态学操作:膨胀与腐蚀 中,我们介绍了图像基本的形态学操作——膨胀与腐蚀,同时也利用了Python进行了实现。在这里我们将接着上次的内容,接着描述其它的一些图像形态学操作方法,以及相应的Python实现。 ...
  • 形态学处理算法之细化操作

    千次阅读 2017-05-31 20:55:22
    应用背景:在前篇讲到形态学基本操作中的击中击不中变换,它有很多应用,数字图像细化处理就是基于击中击不中变换的形态学算法。
  • MATLAB(三) 图像处理--形态学

    千次阅读 2018-05-11 13:11:29
    形态学处理 二值形态学 1. 结构元素的构造与分解 2.腐蚀与膨胀 3.开操作与闭操作 4.形态学滤波器 5.击中或击不中变换 6.二值图像的形态学变换 7.形态学操作 灰度形态学 1.膨胀与腐蚀 2.开操作与闭操作 3.形态学...
  • 数学形态学
  • 膨胀、腐蚀、开、闭运算是数学形态学最基本的变换。 本文主要针对二值图像的形态学 膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔); 腐蚀:把二值图像各1像素连接成分的边界点去掉...
  • 图像形态学处理(2)

    千次阅读 2016-03-17 23:11:18
    接上篇图像形态学处理(1) 5)细化、粗化
  • 二值图像--形态学处理1 数学形态学

    千次阅读 2018-10-08 12:29:45
    学习DIP第11天 转载请标明出处:...。。。。。。。...形态学 ... 数学形态学(Mathematical morphology)是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括...
  • 学习DIP第16天 转载请标明本文出处:...。。。。。。。... 新年第一篇博客,希望大家新年里能都收获更多的知识和技术,今天说的是灰度图像的形态学处理,灰度图像与二值图像的区别在于其记录了灰度信息,所以,形态...
  • 二值图像--形态学处理2 腐蚀和膨胀

    万次阅读 2018-10-08 12:29:36
    学习DIP第12天 ...。。。。。... 今天来介绍形态学中最基础也是最重要的两个操作,腐蚀和膨胀,腐蚀和膨胀基本上是所有形态学操作的基础,除此之外还有补集(即二值图全部取反的操作,0变1,1变0...
  • 学习DIP第14天 ...。。。。。。。... 其实写博客是个很痛苦的过程,要准备一些东西,还怕写错会误导别人,但是在总结和准备相关资料的时候会更深入的理解其中的一些算法原理,然后再根据自己的实际操...
  • 图像形态学处理(3)

    千次阅读 2016-03-18 11:24:25
    接上篇图像形态学处理(2) 2. 灰度级图像形态学 灰度级图像形态学适用于这两种情形:应用希望保留图像灰度阶、需要在二值化前做预处理以突出某些特征
1 2 3 4 5 ... 20
收藏数 45,450
精华内容 18,180
关键字:

形态学处理