形态学图像处理_matlab形态学图像处理:二值图像分割 - CSDN
精华内容
参与话题
  • 数字图像处理第九章——形态学图像处理

    千次阅读 多人点赞 2019-05-11 08:57:30
    数字图像处理第九章数字图像处理---形态学图像处理(一)预备知识1.1 预备知识1.1.1 集合理论中的基本概念1.2 二值图像、集合及逻辑算子(二)膨胀和腐蚀2.1 膨胀2.2 结构元的分解2.3 strel函数2.4 腐蚀(三) 膨胀...

    数字图像处理—形态学图像处理

    同样的,暂时对书上已经写得很清楚的知识点不再重复赘述,主要做一些总结,思考以及知识点的梳理和扩展。

    (一)预备知识

    介绍一下形态学中的一些基本概念。

    1. 用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具
    2. 基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析识别的目的
    3. 形态学图像处理的数学基础和所用语言是集合论
    4. 形态学图像处理的应用可以简化图像数据, 保持它们基本的形状特性,并除去不相干的结 构
    5. 形态学图像处理的基本运算有4个:膨胀、 腐蚀、开操作和闭操作

    1.1 集合理论中的基本概念

    介绍一下比较陌生的几个概念,其他的看书就好:

    1. 所有像素坐标的集合均不属于集合A,记为AcA^c,由下式给出:
      在这里插入图片描述
      这个集合称为集合A的补集

    2. 集合B的反射,定义为:

      即关于原集合原点对称 .

    3. 集合A平移到点z=(z1,z2),表示为(A)z,定义为:

    1.2 二值图像、集合及逻辑算子

    二值图像

    二值图像(Binary Image),按名字来理解只有两个值,0和1,0代表黑,1代表白,或者说0表示背景,而1表示前景。其保存也相对简单,每个像素只需要1Bit就可以完整存储信息。如果把每个像素看成随机变量,一共有N个像素,那么二值图有2的N次方种变化,而8位灰度图有255的N次方种变化,8为三通道RGB图像有255255255的N次方种变化。也就是说同样尺寸的图像,二值图像保存的信息更少。二值图像(binary image),即图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。

    二值图像集合

    如果A和B是二值图像,那么C=A∪B仍是二值图像。这里,如 果 A 和B中相应的像素不是前景像素就是背景像素,那么 C中的这个像素就是前景像素。以第一种观点,函数 C由下式给出:
    在这里插入图片描述
    另一方面,运用集合的观点,C由下式给出:
    在这里插入图片描述
    集合运算

    1. A为图像集合,B为结构元素(集合)。
    2. 数学形态学运算时B对A进行操作。
    3. 结构元素要有1个原点(即结构元素参与形态学运算的参考点),可以是中心像素,原则上可选任何像素。
      注意:原点可以包含在结构元素中,也可以不包含在结构元素中,但运算的结果常不相同。

    编码

    f = imread('D:\数字图像处理\第九章学习\Fig0903(a).tif');
    g = imread('D:\数字图像处理\第九章学习\Fig0903(b).tif');
    subplot(2,3,1), imshow(f);title('(a)二值图像 A:');
    subplot(2,3,2), imshow(g);title('(b)二值图像 B:');
    subplot(2,3,3), imshow(~f);title('(c)A的补集~A:');
    subplot(2,3,4), imshow(f|g);title('(d) A和B的并集 A|B:');
    subplot(2,3,5), imshow(f&g);title('(e)A和B的交集 A & B:');
    subplot(2,3,6), imshow(f&~g);title('(f)A和B的差集 A&~B');
    

    代码运行效果如下
    在这里插入图片描述
    分析

    图像(d)是 “ UTK”和 “ GT” 图像的并集,包括来自两幅图像的所有前景像素。相反,两幅图像的交集(图(e))显示了字母 “ UTK”和 “ GT”中重叠的像素。最后,集合的差集图像(图(f))显示了 “ UTK”中除去 “ GT” 像素后的字母。

    (二)膨胀和腐蚀

    2.1 膨胀

    膨胀:膨胀是在二值图像中“加长”或“变粗”的操作。这种特殊的方式和变粗的程度由一个称为结构元素的集合控制。(实际就是将结构元素的原点与二值图像中的1重叠,将二值图像中重叠部分不是1的值变为1,完成膨胀)。

    公式

    A和B是两个集合,A被B膨胀定义为:

    公式解释:

    1. B的反射进行平移与A的交集不为空。
    2. B的反射:相对于自身原点的映象。
    3. B的平移:对B的反射进行位移

    图解

          

    (a)集合A    (b)结构元素B (黑色为原点所在)

          

    (c)结构元素B的映像    (d)图中两种阴影部分(深色为扩大的部分)合起来为A+B

    注意

    1. 膨胀运算只要求结构元素的原点在目标图像的内部平移,换句话说,当结构元素在目标图像上平移时,允许结构元素中的非原点像素超出目标图像的范围
    2. 膨胀运算具有扩大图像和填充图像中比结果元素小的成分的作用,因此在实际应用中可以利用膨胀运算连接相邻物体和填充图像中的小孔和狭窄的缝隙

    膨胀举例

    膨胀函数

    D = imdilate(A,B)

    图像膨胀的应用:桥接文字裂缝

    编码:

    A = imread('D:\数字图像处理\第九章学习\Fig0906(a).tif');
    B = [0 1 0; 1 1 1; 0 1 0];   %指定结构元素由0和1组成的矩阵
    A2 = imdilate(A, B);    %二值图像
    subplot(1,2,1), imshow(A);title('(a)包括断开文本的输入图像:');
    subplot(1,2,2), imshow(A2);title('(b)膨胀后图像:');
    

    在这里插入图片描述
    图片中字体的加粗,且填充了字母中的小孔和狭窄的缝隙。

    2.2 结构元的分解

    公式
    在这里插入图片描述
    公式理解

    B膨胀A等同于B1先膨胀A,再用B2膨胀之前的结果。

    举例

    下面是由1组成的5x5数组的膨胀:
    在这里插入图片描述
    这个结构元能够分解为值为 1 的 5 元素行矩阵和值为 1 的 5 元素列矩阵:

    在这里插入图片描述
    分析

    在原结构元中,元素个数为 25; 但在行列分解后,总元素数目仅为 10。这意味着首先用 行结构元膨胀,再用列结构元膨胀,能够比 5x5 的数组膨胀快 2.5 倍。在实践中,速度的增长稍微慢一些,因为在每个膨胀运算中总有些其他开销。然而,由分解执行获得的速度方面的增 长仍然有很大意义。

    2.3 strel函数

    工具箱函数 strel 用于构造各种形状和大小的结构元。

    基本语法

    se = strel(shape, parameters)

    shape用于指定希望形状的字符串,parameters是描述形状信息的参数列表。

    具体例子参考课本,是基础语法。

    2.4 腐蚀

    腐蚀:与膨胀相反,对二值图像中的对象进行“收缩”或“细化”。(实际上将结构元素的原点覆盖在每一个二值图像的1上,只要二值图像上有0和结构元素的1重叠,那么与原点重叠的值为0)同样由集合与结构元素完成。

    公式

    A和B是两个集合,A被B腐蚀定义为:

    公式解释:

    1. A被 B 腐蚀是包含在A中的B由z平移的所有点z的集合。
    2. B包含在A中的声明相当于B不共享A背景的任何元素。

    图解
         

    (a)集合A(阴影部分)   (b)结构元素B(阴影部分,深色部分为原点)(c)阴影部分合起来为A-B

    注意

    1. 当结构元素中原点位置不为1(也即原点不属于结构元素时),也要把它看作是1,也就是说,当在目标图像中找与结构元素B相同的子图像时,也要求子图像中与结构元素B的原点对应的那个位置的像素的值是1。
    2. 腐蚀运算要求结构元素必须完全包括在被腐蚀图像内部:换句话说,当结构元素在目标图像上平移时,结构元素中的任何元素不能超过目标图像范围。
    3. 腐蚀运算的结果不仅与结构元素的形状选取有关,而且还与原点位置的选取有关
    4. 腐蚀运算具有缩小图像和消除图像中比结构元素小的成分的作用,因此在实际应用中,可以利用腐蚀运算去除物体之间的粘连,消除图像中的小颗粒噪声

    腐蚀举例

    腐蚀函数

    A2 = imerode(A, se)

    图像腐蚀应用:消除图像细节部分

    编码:

    f = imread('D:\数字图像处理\第九章学习\Fig0908(a).tif');
    se = strel('disk', 10);
    g = imerode(f, se);
    se = strel('disk', 5);
    g1 = imerode(f, se);
    g2 = imerode(f, strel('disk', 20));
    subplot(2,2,1), imshow(f);title('(a)原始图像的尺寸为480x480像素:');
    subplot(2,2,2), imshow(g);title('(b)用半径为10的圆形腐蚀:');
    subplot(2,2,3), imshow(g1);title('(c)用半径为5的圆形腐蚀:');
    subplot(2,2,4), imshow(g2);title('(d)用半径为20的圆形腐蚀');
    

    分析

    假设要除去图a中的细线,但想保留其他结构,可以选取足够小的结构元来匹配中心方块,但较粗的边缘线因太大而无法匹配全部线。图b几乎成功去掉了模板中的细线,图c中一些引线还没有去掉,图d中引线都被去掉了,但是边缘引线也丢失了,所以选取合适的结构元很重要。

    (三) 膨胀与腐蚀的结合

    3.1 开操作和闭操作

    开操作

    1. 使图像的轮廓变得光滑,断开狭窄的间断和消除细的突出物。
    2. 使用结构元素B对集合A进行开操作,定义为:

      先用B对A腐蚀,然后用B对结果膨胀。
    3. 与开操作等价的数学表达式为:
    4. A o B 的边界通过B中的点完成。
    5. B在A的边界内转动时,B中的点所能到达的A的边界的最远点。
    6. A o B 是 A的子集合。
    7. 如果C是D的子集,则 C o B是 D o B的子集。
    8. (A o B) o B = A o B

    闭操作

    1. 同样使图像的轮廓变得光滑,但与开操作相反,它能消除狭窄的间断和长细的鸿沟,消除小的孔洞,并填补轮廓线中的裂痕。
    2. 使用结构元素B对集合A进行闭操作,定 义为:

      先用B对A膨胀,然后用B对结果腐蚀。
    3. A . B的边界通过B中的点完成 。
    4. B在A的边界外部转动 :
    5. A 是 A . B的子集合。
    6. 如果C 是 D 的子集 , 则C . B 是 D . B的子集。
    7. (A . B) . B = A . B

    工具箱函数

    开操作:

    C = imopen(A, B)

    闭操作:

    C = imclose(A, B)

    A为二值图像,B为0,1矩阵组成,并且是指定结构元素。

    函数imopen 和 imclose 的应用

    编码:

    f = imread('D:\数字图像处理\第九章学习\Fig0910(a).tif');
    se = strel('square', 40);
    fo = imopen(f, se);
    fc = imclose(f, se);
    foc = imclose(fo, se);
    subplot(2,2,1), imshow(f), title('(a)原图');
    subplot(2,2,2), imshow(fo), title('(b)开操作');
    subplot(2,2,3), imshow(fc), title('(c)闭操作');
    subplot(2,2,4), imshow(foc), title('(d) (b)的闭操作结果');
    

    分析

    1. 图(a)中的图像设计了一些用于演示开操作和闭操作的特征,比如细小突起、细的桥接点、几个弯口、孤立的小洞、 小的孤立物和齿状边缘。
    2. 图 (b)显示了结果。注意,从图中可以看出,细的突出和外部点的边缘的不规则部分被去除掉了,细的桥接和小的孤立物也被去除了。
    3. 图 ©中的结果: 这里,细的弯口、内部的不规则边缘和小洞都被去除了。先做开操作的闭操作的结果有平滑效果.
    4. 图 (d)显示了平滑过的物体。

    噪声滤波器

    先开操作再闭操作,构成噪声滤波器。

    编码:

    f = imread('D:\数字图像处理\第九章学习\Fig0911(a).tif');
    se = strel('square', 6);
    fo = imopen(f, se);
    foc = imclose(fo, se);
    subplot(1,3,1), imshow(f), title('(a)带噪声的指纹图像');
    subplot(1,3,2), imshow(fo), title('(b)图像的开操作');
    subplot(1,3,3), imshow(foc), title('(c)先用开操作,再用闭操作');
    

    在这里插入图片描述
    分析

    1. 图(a)是受噪声污染的指纹二值图像,噪声为黑色背景上的亮元素和亮指纹部分的暗元素。
    2. 图(b)所示的图像。发现,对图像进行开操作可以去除噪声点,但是这种处理在指纹的纹脊上又引入一些缺口
    3. 图( c )显示了最终结果。在这个结果中,大多数噪声被消除了,开运算的闭运算可以给指纹填充缺口,但是指纹纹路并没有完全恢复 。

    3.2 击中或击不中变换

    击中击不中变换(HMT),HMT变换可以同时探测图像的内部和外部。研究解决目标图像识别模式识别等领域,在处理目标图像和背景的关系上能够取得更好的效果。

    作用:形状检测的基本工具。

    公式

    A中对B进行的匹配(击中)表示为:

    B1是由与一个对象相联系的B元素构成的集合,B1是由与一个对象相联系的B元素构成的集合。

    图解

    工具箱函数

    C = bwhitmiss(A, B1, B2)

    其中的 C为结果,A为输入图像,B1、B2表示结构元素。

    定位图像中物体左上角的像素

    编码:

    f = imread('D:\数字图像处理\第九章学习\Fig0913(a).tif');
    B1 = strel([0 0 0;0 1 1; 0 1 0]);
    B2 = strel([1 1 1;1 0 0;1 0 0]);
    g = bwhitmiss(f,B1,B2);
    subplot(1,2,1), imshow(f), title('(a)原始图像');
    subplot(1,2,2), imshow(g), title('(b)击中、击不中变换的结果');
    

    分析

    1. 图(a)显示了包括各种尺寸的正方形图像。我们要定位有东、南相邻像素(这些 “击中”)和没有东北、北、西北、西和西南相邻像素(这些 “击不中”)的前景像素。这些要求导致以下B1,B2两个结构元。这两个结构元都不包括东南邻域像素,这称为不关心像素。用函数 bwhitmiss 来计算变换。
    2. 图 (b)中的每个单像素点都是图 (a)中物体左上角的像素。图 (b)中是放大后的像素,以便更清晰。bwhitmiss的替代语法可以把Bl 和 B2 组合成间隔矩阵。只要 B1等于 1 或-1,B2 等于 1, 间隔矩阵就等于 1。对于不关心像素,间隔矩阵等于 0。

    3.3 bwmorph函数

    工具箱函数 bwmorph 执行许多以膨胀、腐蚀和查找表运算相结合为基础的形态学操作, 调用语法为:

    g = bwmorph(f, operation, n);

    f 是输入的二值图像,operation 是指定所希望运算的字符串,n 是指定重复次数的正整数。

    细化

    f = imread('D:\数字图像处理\第九章学习\Fig0911(a).tif');
    g1 = bwmorph(f, 'thin',1);
    g2 = bwmorph(f, 'thin',2);
    ginf = bwmorph(f,'thin', Inf);
    subplot(1,4,1),imshow(f);title('(a)指纹图像:');
    subplot(1,4,2),imshow(g1);title('(b)细化一次后的指纹图像:');
    subplot(1,4,3),imshow(g2);title('(c)细化两次后的图像:');
    subplot(1,4,4),imshow(ginf);title('(d)一直细化到稳定状态的图像:');
    

    在这里插入图片描述
    骨骼化

    f = imread('D:\数字图像处理\第九章学习\Fig0916(a).tif');
    fs = bwmorph(f,'skel',Inf);
    for k = 1:5
        fa = fs & ~endpoints(fs);
    end
    subplot(1,3,1),imshow(f);title('(a)骨头图像:');
    subplot(1,3,2),imshow(fs);title('(b)使用函数 bwmorph 得到的骨豁:');
    subplot(1,3,3),imshow(fa);title('(c)使用函数 endpoint 裁剪后的骨豁:');
    

    在这里插入图片描述
    分析:骨骼化(Gonzalez和 Woods[2008])是另一种减少二值图像中的物体为一组细“笔画”的方法, 这些细骨豁仍保留原始物体形状的重要信息。当 operation 置为 'skel '时,函数 bwmorph 执行骨骼化。令 f 代表图(a)中类似骨头的图像,为了计算骨骼,调用 bwmorph, 令 n=Inf,图(b)显示了骨骼化的结果,与物体的基本形状相似。骨骼化和细化经常产生短的无关的“毛刺” ,有时这被叫做寄生成分。清除(或除去)这些“毛刺”的处理称为裁剪。方法是反复确认并去除端点。通过 5 次去除端点的迭代,得以后处理骨骼化图像 fs,图(c )显示了结果。

    (四)标记连通分量

    工具箱函数

    [L, num] = bwlabel (f, conn)

    f 是输入二值图像,coon指定希望的连接方式(不是4连接就是8连接),输出L叫做标记矩阵,函数num则给出找到的连通分量总数。

    计算和显示连通分量的质心:

    f = imread('D:\数字图像处理\第九章学习\Fig0917(a).tif');
    imshow(f);title('(a)标注连通分量原始图像:');
    [L,n]=bwlabel(f);        %L为标记矩阵,n为找到连接分量的总数
    [r,c]=find(L==3);        %返回第3个对象所有像素的行索引和列索引 
    rbar=mean(r);
    cbar=mean(c);
    figure,imshow(f);title('(b)标记所有对象质心后的图像:');
    hold on            %保持当前图像使其不被刷新
    for k=1:n
       [r,c]=find(L==k);
       rbar=mean(r);
       cbar=mean(c);
       plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k',...
            'MarkerFaceColor','k','MarkerSize',10);
       plot(cbar,rbar,'Marker','*','MarkerFaceColor','w'); %其中的marker为标记
    end
    

    (五)形态学重建

    概述:重构是一种涉及到两幅图像和一个结构元素的形态学变换。一幅图像,即标记,是变换的开始点。另一幅图像是掩膜,用来约束变换过程。结构元素用于定义连接性。

    定义:若G是掩膜,f为标记,则从f重构g可以记为RgR_g(f),由下列的迭代过程定义:

    1. 将h1初始化为标记图像f。
    2. 创建结构元素 :B = ones(3)。
    3. 重复

      直到

      其中,标记f必须是g的一个子集。

    函数

    out = imreconstruct(marker,mask)

    masker是标记,mask是掩膜。

    5.1 通过重建进行开操作

    在形态学开操作中,腐蚀典型地去除小的物体,且随后的膨胀趋向于恢复保留的物体形状。 然而,这种恢复的精确度取决于形状和结构元之间的相似性。本节讨论的方法,通过重建进行开操作能准确地恢复腐蚀之后的物体形状。用结构元B对图像 G通过重建进行开操作可定义为 :
    在这里插入图片描述

    f = imread('D:\数字图像处理\第九章学习\Fig0917(a).tif');
    subplot(3,2,1),imshow(f);title('(a)重构原始图像');
    fe=imerode(f,ones(51,1));%竖线腐蚀
    subplot(3,2,2),imshow(fe);title('(b)使用竖线腐蚀后的结果');
    fo=imopen(f,ones(51,1));%竖线做开运算
    subplot(3,2,3),imshow(fo);title('(c)使用竖线做开运算结果');
    fobr=imreconstruct(fe,f);%fe做标记
    subplot(3,2,4),imshow(fobr);title('(d)使用竖线做重构开运算');
    ff=imfill(f,'holes');%对f进行孔洞填充
    subplot(3,2,5),imshow(ff);title('(e)对f填充孔洞后的图像');
    fc=imclearborder(f,8);%清除边界,2维8邻接
    subplot(3,2,6),imshow(fc);title('(f)对f清除边界后的图像');
    

    在这里插入图片描述
    分析

    1. 传统开运算中,腐蚀去除掉小对象,随后的膨胀恢复原始对象形状,但受元素结构影响,恢复的往往不是很精确。
    2. 重构则能精确恢复原始图像。

    5.2 填充孔洞

    令I表示二值图像,假设我们选择标记图像F,除了图像边缘外,其余部分都为 0, 边缘部分设值为 1-I:
    在这里插入图片描述
    函数

    g = imfill(f,‘holes’);

    5.3 清除边界物体

    定义标记图像F为:
    在这里插入图片描述
    其中,/是原始图像,然后以/作为模板图像,重建
    在这里插入图片描述
    得到一幅图像H, 其中仅包含与边界接触的物体。

    函数

    g = imclearborder(f,conn)

    f 是输入图像,g 是结果。conn 的值不是 4 就是 8(默认)。 物体更亮且与图像边界相连接的结构。

    (六)灰度级形态学

    6.1 膨胀和腐蚀

    灰度图像的形态学梯度定义为膨胀运算与腐蚀运算的结果之间的差值。

    膨胀定义

    1. 使用结构元素b对f的灰度膨胀定义为:

      其中,DfD_fDbD_b分别是f和b的定义域,f和b是函数而不是二值形态学情况中的集合。

    2. 当结构元素b是平坦的,即b(x,y)在其定义域内都为0时:
      在这里插入图片描述

    腐蚀定义

    1. 使用结构元素b对f的灰度腐蚀定义为:
      在这里插入图片描述
      其中,DfD_fDbD_b分别是f和b的定义域。

    2. 当结构元素b是平坦的,即b(x,y)在其定义域内都为0时:
      在这里插入图片描述

    膨胀和腐蚀操作

    编写代码:

    f = imread('D:\数字图像处理\第九章学习\Fig0923(a).tif');
    se=strel('square',3);  %构造了一个平坦的3x3的结构元素
    gd=imdilate(f,se);    %对原图像进行膨胀操作
    ge=imerode(f,se);     %对原图像进行腐蚀操作
    morph_grad=imsubtract(gd,ge); %从膨胀的图像中减去腐蚀过得图像产生一个形态学梯度。
    subplot(3,2,1);imshow(f,[]);title('(a)原始图像');
    subplot(3,2,2),imshow(gd,[]);title('(b)膨胀的图像');
    subplot(3,2,3),imshow(ge,[]);title('(c)腐蚀的图像');
    subplot(3,2,4),imshow(morph_grad,[]);title('(d)形态学梯度');
    

    在这里插入图片描述
    分析

    1. 膨胀得到的图像比原图像更明亮,并且减弱或消除小的,暗的细节部分。即比原图像模糊。
    2. 腐蚀得到的图像更暗,并且尺寸小,明亮的部分被削弱 。

    6.2 开操作和闭操作

    图像开运算

    1. 在灰度图像中,开操作的表达式与二值图像拥有相同的形式。
    2. 把一幅图像看做是一个三维表明,其亮度值代表xy平面上的高度值,则当结构元素b在f下面活动时,结构元素的任何部分的最高值构成了开运算的结果。
    3. 先进行腐蚀操作可以除去小的亮的图像细节,但这样会使图像变暗,接下来进行膨胀操作增强图像的整体亮度。

    图像闭运算

    1. 在灰度图像中,闭操作的表达式与二值图像拥有相同的形式。
    2. 当结构元素b在f的上面活动时,结构元素的任何部分的最低值构成了闭运算的结果 。
    3. 先通过膨胀操作除去图像中的暗细节,同时增加图像的亮度,接下来对图像进行腐蚀,而不会将膨胀操作除去的部分重新引入图像中。

    用开操作和闭操作做形态学平滑

    f = imread('D:\数字图像处理\第九章学习\Fig0925(a).tif');
    subplot(3,2,1),imshow(f);  
    title('(a)木钉图像原图');   
    se=strel('disk',5);     %disk其实就是一个八边形  
    fo=imopen(f,se);        %经过开运算  
    subplot(3,2,2),imshow(f);  
    title('(b)使用半径5的disk开运算后的图像');   
    foc=imclose(fo,se);  
    subplot(3,2,3),imshow(foc);  
    title('(c)先开后闭的图像'); 
    focd=imclose(f,se);  
    subplot(3,2,4),imshow(focd);  
    title('(d)原始图像的闭操作'); 
    foce=imopen(focd,se);  
    subplot(3,2,5),imshow(foce);  
    title('(e)先闭后开的图像'); 
    fasf=f;  
    for i=2:5  
        se=strel('disk',i);  
        fasf=imclose(imopen(fasf,se),se);  
    end  
    subplot(3,2,6),imshow(fasf);  
    title('(f)使用开闭交替滤波后图像'); 
    
    
    

    在这里插入图片描述
    分析

    1. 图 (b)显示了开操作的图像 fo, 在这里,我们看到,亮区域己经被调低了(平滑),木钉上的暗条文几乎没有受影响。
    2. 图 (c )显示了开操作的闭操作 foe。现在我们注意到,暗区域已经被平滑得很好了,结果是整个图像得到全部平滑。这种过程通常叫做开-闭滤波。先开运算后闭运算构成噪声滤波器,用来平滑图像并去除噪声。
    3. 图 (d)显示了原始图像的闭操作结果。木钉上的暗条文已经被平滑掉了,主要留下了亮的细节(注意背景中的亮条文)。
    4. 图 (e)显示了这些条文的平滑和木钉表面的进一步平滑效果。最终结果是原始图像得到全部平滑。
    5. 图(f)是交替顺序滤波,交替顺序滤波的一种形式是用不断增大的一系列结构元执行开-闭滤波,刚开始用小的结构元,增加大小,直到与图 (b)和©中结构元的大小相同为止。交替顺序滤波与单个开-闭滤波相比,处理图像更平滑一些。

    非均匀背景的补偿

    f = imread('D:\数字图像处理\第九章学习\Fig0926(a).tif');
    g = f>=(255*graythresh(f));
    se=strel('disk',100);
    fo=imopen(f,se);
    f2=imsubtract(f,fo); 
    g1 = f2>=(255*graythresh(f2));
    subplot(2,3,1),imshow(f);  
    title('(a)原始图像');  
    subplot(2,3,2),imshow(g);  
    title('(b)经过阈值处理后的图像');   
    subplot(2,3,3),imshow(f);  
    title('(c)原图开运算后的图像');  
    subplot(2,3,4),imshow(f2);  
    title('(d)原图减去开运算');  
    subplot(2,3,5),imshow(g1);  
    title('(e)最终结果');  
    

    在这里插入图片描述
    分析

    1. 图 (a) :显示了一幅米粒的图像f,图像下部的背景比上部的黑。这样的话,对不平坦的亮度进行阈值处理会很困难。
    2. 图 (b) "是阈值处理方案,图像顶端的米粒被很好地从背景中分离开来,但是图像底部的米粒没有从背景中正确地提取出来。
    3. 图(c ):对图像进行开操作,可以产生对整个图像背景的合理估计。
    4. 图(d) :把图(c )从原始图像中减去,生成一幅拥有合适的均勾背景的米粒图像.
    5. 图(e):显示了新的经阈值处理后的图像。注意,改进效果超过了图 (b)。

    粒度测定 :

    颗粒分析:形态学技术可以用与间接地度量颗粒的大小分布,但不能准确地识别每一个颗粒。对于形状规则且亮于背景大的颗粒,基本方法是应用不断增大尺寸的形态学开运算。

    f = imread('D:\数字图像处理\第九章学习\Fig0926(a).tif');
    sumpixels=zeros(1,36);  
    for k=0:35  
        se=strel('disk',k);  
        fo=imopen(f,se);  
        sumpixels(k+1)=sum(fo(:));  
    end    
    %可以看到,连续开运算之间的表面积会减少  
    plot(0:35,sumpixels),xlabel('k'),ylabel('surface area');  
    title('(a)表面积和结构元素半径之间的关系');  
    figure,plot(-diff(sumpixels));%diff()函数为差分或者近似倒数,即相邻2个之间的差值  
    xlabel('k'),ylabel('surface area reduction');  
    title('(b)减少的表面积和结构元素半径之间的关系'); 
    

    分析

    1. (a)连续开运算之间的表面积会减小。
    2. (b)图峰值表明出现了大量的有着这种半径的对象。

    6.3 重建

    重建

    1. h极小值变换:标记图像是由掩膜挑选ing减去常量所得。
    2. 开运算重建:先腐蚀后重建。
    3. 闭运算重建:对图像求补、计算其开操作重建并对结果求补。

    重建移去复杂的背景

    f = imread('D:\数字图像处理\第九章学习\Fig0930(a).tif');
    subplot(3,3,1),imshow(f);  
    title('(a)原图像');    
    f_obr=imreconstruct(imerode(f,ones(1,71)),f);  
    subplot(3,3,2),imshow(f_obr);  
    title('(b)重建的开操作');   
    f_o=imopen(f,ones(1,71));    
    subplot(3,3,3),imshow(f_o);  
    title('(c)开操作');    
    f_thr=imsubtract(f,f_obr);    %顶帽重构
    subplot(3,3,4),imshow(f_thr);  
    title('(d)重建的顶帽操作');  
    f_th=imsubtract(f,f_o)    %标准顶帽运算,方便比较
    subplot(3,3,5),imshow(f_th);  
    title('(e)顶帽操作');  
    g_obr=imreconstruct(imerode(f_thr,ones(1,11)),f_thr);  
    subplot(3,3,6),imshow(g_obr);  
    title('(f)用水平线对(b)经开运算后重建图');   
    g_obrd=imdilate(g_obr,ones(1,2));  
    subplot(3,3,7),imshow(g_obrd);  
    title('(g)使用水平线对(f)进行膨胀');  
    f2=imreconstruct(min(g_obrd,f_thr),f_thr);  
    subplot(3,3,8),imshow(f2);  
    title('(h)最后的重建结果');  
    

    在这里插入图片描述
    分析

    为了消除每个键盘上方的水平反射光,利用这些反射比图像中任何文本字符都要宽的这个事实。用长水平线的结构元执行重建的开操作,重建的开操作(f_obr) 显示于图(b)中。为了进行对比,图(c )显示了标准的开操作 (f_o) 。重建的开操作在提取水平的相邻键之间的背景方面的确较好。从原始图像中减去重建的开操作被称为顶帽重建 , 结果示于图 (d)中。消除图 (d)中键右边的垂直反射光。这可以通过用短的水平线执行重建的开操作来完成,在这个结果中(见图 (f)),垂直的反射光不见了。但是,包括字母的垂直的细笔画也不见了。我们利用了那些已被错误消除的字母非常接近第一次膨胀(见图 (g))后还存在的其他字符这一事实,以 f_thr 作为模板,以 min(g_obrd,f_thr) 作为标记,图 (h)显示了最后的结果。注意,背景上键盘的阴影和反射光都成功去除了。

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

    万次阅读 多人点赞 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);

    展开全文
  • 数字图像处理(一) ——形态学处理

    万次阅读 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)二值图像、集合及逻辑算子(二)膨胀与腐蚀(1)膨胀(2)结构元的分解(3)strel函数(4)腐蚀(三)膨胀与腐蚀的结合(1)开操作和闭操作(2)击中和或...

    说明:“形态学”通常指的是生物学的某个分支,常用来处理动物和植物的形状和结构。现在,我们也将这个词用于图像处理中,作为提取图像分量的一种工具,这些分量在表示和描述区域形状、形态学滤波、细化、粗化等是非常有用的。

    (一)基础知识

    (1)集合论中的基本概念

    如果(x,y)是来自Z2的整数,f是分配给每个不同坐标对(x,y)的亮度值的映射,那么函数f(x,y)被称为数字图像。令A是Z2中的集合,A中的元素是坐标(x,y)处的像素。
    若w=(x,y)属于 A中的元素,则表示为:
    在这里插入图片描述
    若w 不属于 A中的元素,表示为:
    在这里插入图片描述
    若满足一定条件的像素坐标集合B,表示为:
    在这里插入图片描述
    若像素坐标的集合均不属于集合A,则表示为Ac
    在这里插入图片描述
    若集合C同属于集合A和集合B,交集表示为:
    在这里插入图片描述
    集合A和集合B的并集C,表示为:
    在这里插入图片描述
    集合A和集合B的差集(属于A但不属于B的所有像素坐标),表示为:
    在这里插入图片描述
    集合B的反射表示为:
    在这里插入图片描述
    点z=(z1,z2)对集合A的平移表示为:
    在这里插入图片描述
    在这里插入图片描述

    (2)二值图像、集合及逻辑算子

    二值图像是指在图像中,灰度等级只有两种,通俗来说,就是图像中的任何像素不是0就是1,再无其他过渡的灰度值。
    在这里插入图片描述编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0627(b).tif');
    g = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0627(c).tif');
    subplot(231),imshow(f),title('f');
    subplot(232),imshow(g),title('g');
    a = f&g;
    subplot(233),imshow(a,[]),title('f和g的交集');
    b = f|g;
    subplot(234),imshow(b),title('f和g的并集');
    c = f&~g;
    subplot(235),imshow(c),title('f和g的差集');
    d = ~f;
    subplot(236),imshow(d),title('f的补集');
    

    在这里插入图片描述

    (二)膨胀与腐蚀

    (1)膨胀

    顾名思义,膨胀就是使图像中的目标“变粗”的操作。这种特殊的方式和变粗程度由一种被称为结构元的形状来控制的。A被B膨胀,表示为A⊕B,集合操作表示为:在这里插入图片描述
    其中,A是图像,B是结构元,结构元通常比图像小得多。膨胀满足结合律和交换律

    在matlab中使用函数reflect计算结构元的反射在这里插入图片描述
    使用函数imdilate进行膨胀,语法为:

    D = imdilate(A,B)  %A是图像,B是结构元
    

    编写实验代码:

    A = imread('C:\Users\Public\Pictures\Sample Pictures\dingdangmao.jpg');
    B = [0 1 0;1 1 1;0 1 0];
    subplot(121),imshow(A),title('原图像')
    D = imdilate(A,B);
    subplot(122),imshow(D),title('执行膨胀后')
    

    在这里插入图片描述
    在这里插入图片描述B = [1 1 1;0 0 0;1 1 1];更换结构元后的图像
    在这里插入图片描述
    在这里插入图片描述实验分析: 当设置结构元B后,对A图像进行膨胀,变换后的图像是将内部进行膨胀,因而看到叮当猫的黑色轮廓变细了、眼睛变小了、胡须也变细了。是由于实验所设计的结构元B是内部为1,而边缘部分为0所造成的。当设置不同的结构元,操作膨胀的结果是不同的,可以根据需要调整结构元。

    (2)结构元的分解

    结构元B可以描述为结构元B1和B2的膨胀:B=B1⊕B2。由于膨胀满足结合律,所以A⊕B=A⊕(B1⊕B2)=(A⊕B1)⊕B2,这样B就可以分解为B1和B2两个结构元

    进行结构元的分解是使膨胀的速度增加,减少其他不必要的开销。 比如说:在这里插入图片描述
    这样的矩阵操作膨胀需要对25个元素进行膨胀,若将其分解成如下形式,
    在这里插入图片描述
    这样的操作速度就会从膨胀25个元素变成操作10个元素即可。

    (3)strel函数

    strel函数是用于构造各种形状和大小的结构元,语法为:

    se = strel(shape,parameters) %shape是用于指定希望形状的字符串,parameters是形状信息的参数
    

    在这里插入图片描述用函数strel编写实验代码:

    se = strel('diamond',5)  %构造菱形结构元,水平和垂直均扩展5个像素
    decomp = getsequence(se);    %提取并检查分解中单独的结构元
    whos
    into decomp:
    decomp(1).Neighborhood
    decomp(2).Neighborhood
    decomp(3).Neighborhood
    decomp(4).Neighborhood
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    (4)腐蚀

    腐蚀是膨胀的反操作,是将图像中的目标进行“细化”的操作,收缩的方法和程度也由结构元控制。A被B腐蚀表示为AΘB,集合操作表示为:
    在这里插入图片描述
    在matlab工具中,运用函数imerode进行腐蚀操作,编写代码如下:

    A = imread('C:\Users\Public\Pictures\Sample Pictures\dingdangmao.jpg');
    subplot(221),imshow(A),title('原始图像')
    se = strel('disk',10);
    E10 = imerode(A,se);
    subplot(222),imshow(E10),title('半径为10进行腐蚀')
    
    se = strel('disk',5);
    E5 = imerode(A,se);
    subplot(223),imshow(E5),title('半径为5进行腐蚀')
    
    se = strel('disk',20);
    E20 = imerode(A,se);
    subplot(224),imshow(E20),title('半径为20进行腐蚀')
    

    在这里插入图片描述在这里插入图片描述
    实验分析: 腐蚀相当于膨胀的反操作,将内部图像进行腐蚀,黑色边缘就变得越来越粗,当我们使用半径不同的结构元时,可以得到不一样的腐蚀结果。腐蚀可以用于弥补小裂缝的。假设把叮当猫的眼睛当成孔洞,用半径为20的圆形结构元进行腐蚀,结果显示可以将腐蚀操作可以眼睛填充,作用弥合裂缝孔洞等。

    (三)膨胀与腐蚀的结合

    用膨胀与腐蚀有三种组合:开操作、闭操作、击中或击不中变换

    (1)开操作和闭操作

    开操作是指A被B腐蚀,然后再用B膨胀的结果,开操作表示为:
    在这里插入图片描述
    开操作主要用于平滑目标的轮廓,断开了细的连接部分,去掉了细的突出

    闭操作指的是A被B膨胀,再进行腐蚀的操作,表示为:
    在这里插入图片描述
    闭操作主要用于连接窄的断裂并填满细长的“沟壑”,填满比结构元小的孔洞。
    在这里插入图片描述在matlab中用函数imopen表示开操作,函数imclose表示闭操作:

    C = imopen(A,B)  %开操作,B是0和1的矩阵
    C = imclose(A,B)  %闭操作,B是0和1的矩阵
    

    编写实验代码:

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\dingdangmao.jpg');
    subplot(221),imshow(f),title('原始图像')
    se = strel('square',10);
    fo = imopen(f,se);
    subplot(222),imshow(fo),title('开操作');
    fc = imclose(f,se);
    subplot(223),imshow(fc),title('闭操作');
    foc = imclose(fo,se);
    subplot(224),imshow(foc),title('先开操作,后闭操作');
    

    在这里插入图片描述
    se = strel('square',10); 修改方形结构元为10后得到的结果
    在这里插入图片描述
    在这里插入图片描述
    se = strel('square',3); 修改方形结构元为3后得到的结果
    在这里插入图片描述实验分析: 开操作可以用在去除噪声的实验中,这并没有改变图像的位置与基本轮廓,当实验只关心物体的位置和个数的时候,腐蚀的计算速度比单独过滤噪声更具有优势。另外说明,开闭运算是对偶的,对于某图像多次应用开运算或者闭运算,和只进行一次运算的效果相同。正如上面说明的那样,开操作和闭操作中的腐蚀和膨胀与结构元的状态紧密相关,当选取的结构元半径比较小的时候,基本看不出变换,反之选取的半径过大,会将原始图像变成另一种模样,因此选择膨胀和腐蚀的结构元时要选择合适的结构元的结构状态。

    (2)击中和或击不中变换

    击中击不中变换是形态学形状检测的基本工具,是用来查找像素局部模式的形态学运算符。‘局部’是指‘结构元素’的大小。

    A被B击中或击不中变换表示为:
    在这里插入图片描述
    其中,B是结构元对,表示如下:
    在这里插入图片描述
    击中或击不中变换的输出图像由所有在B1中匹配的像素(击中)和未在B2中匹配的像素(击不中)组成。

    使用函数bwhitmiss实现,语法为:

    C = bwhitmiss(A,B1,B2)
    

    编写代码如下:

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0913(a).tif');
    subplot(121),imshow(f),title('原始图像')
    B1 = strel([0 0 0;0 1 1;0 1 0]);
    B2 = strel([1 1 1;1 0 0;1 0 0]);
    g = bwhitmiss(f,B1,B2);
    subplot(122),imshow(g,[]),title('击中或击不中变换')
    interval = [-1 -1 -1;-1 1 1;-1 1 0]  %间隔矩阵
    

    在这里插入图片描述执行击中或击不中变换的图像,仔细一看,是将原图像中符合匹配的点提取出来,显示在上面,由于图像比较暗,所以不是很明显。击中或击不中变换就是当符合的点提取,用来查找局部内容的形态学操作。
    在这里插入图片描述

    (3)运用查询表

    当击中或击不中结构元较小的时候,计算击中或击不中变换比较快速的方法是利用查询表(LUT)。这种方法预先计算出每个可能邻域结构的输出像素值,然后把这些值存入查询表中以备后面使用。
    比如说,有3×3矩阵系数和像素值结构:
    (矩阵系数)在这里插入图片描述
    (像素值结构)在这里插入图片描述
    然后将对应相乘并相加起来,得到最后的结果值:1(1)+2(1)+4(1)+8(1)+16(0)+32(0)+64(0)+128(1)+256(1)=399

    工具箱中提供了两个函数makelut和函数applylut用于查询表,函数makelut用于构造查询表,函数applylut用这个查询表处理二值图像。我们编写函数endpoints.m用于makelut和applylut在二值图像中检测端点,使用如下:persistent lut,建立名为lut的变量,并标明这个变量是永久的。MATLAB在函数间调用时会记住这个变量的值。函数endpoints第一次被调用时,变量lut自动初始化为空矩阵([ ])。当lut为空时,调用函数makelut用它发送句柄给函数endpoint_fc。之后,用函数applylut查询表寻找端点时,查询表被存入永久变量lut中,以后调用就不用重新计算了。

    函数endpoints的M-文件:

    function g = endpoints(f)
    %ENDPOINTS Computes end points of a binary image.
    %   G = ENDPOINTS(F) computes the end points of the binary image F
    %   and returns them in the binary image G. 
    
    %   Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
    %   Digital Image Processing Using MATLAB, Prentice-Hall, 2004
    %   $Revision: 1.3 $  $Date: 2003/04/22 01:18:18 $
    
    persistent lut
    
    if isempty(lut)
       lut = makelut(@endpoint_fcn, 3);
    end
    
    g = applylut(f,lut);
    
    %-------------------------------------------------------------------%
    function is_end_point = endpoint_fcn(nhood)
    %   Determines if a pixel is an end point.
    %   IS_END_POINT = ENDPOINT_FCN(NHOOD) accepts a 3-by-3 binary
    %   neighborhood, NHOOD, and returns a 1 if the center element is an
    %   end point; otherwise it returns a 0. 
    
    is_end_point = nhood(2,2) & (sum(nhood(:)) == 2);
    
    

    编写实验代码:

    persistent lut
    lut = makelut(@conwaylaws,3)
    bw1 = [0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0;0 0 0 1 0 0 1 0 0 0;0 0 0 1 1 1 1 0 0 0;0 0 1 0 0 0 0 1 0 0;0 0 1 0 1 1 0 1 0 0;0 0 1 0 0 0 0 1 0 0;0 0 0 1 1 1 1 0 0 0;0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0];
    imshow(bw1,'InitialMagnification','fit'),title('Generation 1')
    bw2 = applylut(bw1,lut);
    figure,imshow(bw2,'InitialMagnification','fit'),title('Generation 2')
    bw3 = applylut(bw2,lut);
    figure,imshow(bw3,'InitialMagnification','fit'),title('Generation 3')
    

    在这里插入图片描述

    (4)bwmorph函数

    函数bwmorph h用于执行许多以膨胀、腐蚀和查找表运算相结合为基础的形态学操作,语法是:

    g = bwmorph(f,operation,n) %operation是指定所希望运算的字符串,n是指定重复次数的正整数
    

    在这里插入图片描述在这里插入图片描述以上操作,主要关注的是细化和骨骼化。细化就是指将图像中的目标形状减少为单个像素宽度的“笔画”。

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0911(a).tif');
    g1 = bwmorph(f,'thin',1);
    g2 = bwmorph(f,'thin',2);
    subplot(231),imshow(f),title('原始图像');
    subplot(232),imshow(g1),title('一次细化');
    subplot(233),imshow(g2),title('二次细化');
    
    ginf = bwmorph(f,'thin',Inf);  
    subplot(234),imshow(ginf),title('细化到稳定状态')
    
    fs = bwmorph(f,'skel',Inf);
    subplot(235),imshow(fs),title('骨骼化图像')
    
    fs = bwmorph(fs,'spur',5);   %与骨骼化效果大概一致
    subplot(236),imshow(fs),title('除去“毛刺”图像')
    

    在这里插入图片描述在这里插入图片描述在这里插入图片描述实验分析: 进行去除“毛刺”操作,得到的图像与上面骨骼化后的图像基本一致。虽然所运用的算法操作不同,但是结果会可能基本一致。这个去除“毛刺”的操作被称为裁剪,可以使用endpoints来获得,其原因是进行反复确认并去除端点。通过5次去除端点的迭代,变成了骨骼化的结果。
    在这里插入图片描述
    实验分析: 用指纹图像再执行一次算法,说明算法的稳定性。将第五幅图和第六幅图进行对比,可以明显的看出,去除“毛刺”操作与骨骼化是大概一致,但附近的噪声点发现在第六幅图中得到了滤除。一次细化后比原始图像的噪声点少一些,而且指纹也变细了,细化到稳定状态时,指纹基本上只剩下一个像素的轮廓,说明已经达到了最细的状态。
    在这里插入图片描述

    (四)标记连通分量

    连通分量概念:
    无向图的极大连通子图称为的连通分量( Connected Component)。任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量(来自百度百科)。

    邻域定义:
    坐标为(x,y)的像素p有两个水平和两个垂直相邻像素,它们的坐标分别为(x+1,y)、(x-1,y)、(x,y+1)、(x,y-1),这4个相邻像素的集合表示为在这里插入图片描述。p的4个对角线相邻像素的坐标分别是(x-1,y-1)、(x+1,y-1)、(x-1,y++1)、(x+1,y+1),它们称为在这里插入图片描述。上面两种邻域的并集是p的8相邻像素,表示为在这里插入图片描述

    邻接定义:
    如果在这里插入图片描述,则q和p就被称为4邻接的;同样,q若属于8邻域、D邻域内,则q和p就分别是8邻接和D邻接。

    如果在像素p和q之间存在一条4连接通路,就称这两个前景像素为4连接的;同理,如果在像素p和q之间存在一条8连接通路,就称这两个前景像素为8连接的。连通分量用通路来定义,而通路的定义按照所用邻接的类型而定。通俗来说,连通分量的性质决定我们所选择的邻接方式,常见的为4邻接和8邻接,同时邻接方式还决定图像中连通分量的数目。

    在matlab中用函数bwlabel计算二值图像中所有的连通分量,基本语法为:

    [L,num] = belabel(f,conn) %L是标记矩阵,num是找出的连通分量的总数,f是二值图像,conn是连接方式(默认为8)
    

    编写实验代码:

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0219(a).tif');
    [L,n] = bwlabel(f);
    
    imshow(f),title('原始图像');
    hold on
    for k = 1:n
    [r,c] = find(L==k);
    rbar = mean(r);
    cbar = mean(c);
    plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
    plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'),title('相应连通分量上的质心显示为*');
    end
    

    在这里插入图片描述
    此操作为在连通分量的质心上标记*,以此来说明连通分量的位置及个数。
    在这里插入图片描述在这里插入图片描述

    (五)形态学重建

    重建是一种形态学变换,包括两幅图像和一个结构元。一幅图像是标记,是变换的开始点;另一幅图是模板,用于约束变换过程。结构元时用来定义连通性,默认是8连接。
    基本迭代过程是(模板是G,标记是F):

    1. 将标记图像F初始化为h1;
    2. 建立结构元:B = onese(3);
    3. 重复hk+1=(hk⊕B)∩G,直到hk+1=hk。

    以上是理论的方法,但实际会使用更快的计算方法,在matlab中使用函数imreconstruct用于快速混合重建算法,编写为:
    out = imreconstruct(marker,mask)

    (1)通过重建进行开操作

    在形态学开操作中,腐蚀典型地去除小的物体,且随后的膨胀趋向于恢复保留的物体形状。但这个恢复的精确度取决于形状和结构元之间的相似性,说明并不是所有情况都是适用的。现在,用一种比较好的方式来解决这个问题,那就是通过重建进行开操作能准确地恢复腐蚀之后的物体形状。
    其集合表示为:
    在这里插入图片描述
    编写实验代码:

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0917(a).tif');
    fe = imerode(f,ones(51,1));
    fo = imopen(f,ones(51,1));
    fobr = imreconstruct(fe,f);
    subplot(221),imshow(f),title('原始图像');
    subplot(222),imshow(fe),title('用竖线腐蚀后图像');
    subplot(223),imshow(fo),title('用竖线进行开操作图像');
    subplot(224),imshow(fobr),title('用竖线重建后图像');
    

    在这里插入图片描述在这里插入图片描述

    (2)填充孔洞

    孔洞填充: 先选取十字形结构作为结构元;接着生成一个由0组成的阵列X,大小与二值图像A相同,随机选取A中一个灰度值为1的点,将X中相应位置的灰度值也设置为1;之后根据填充的公式多次迭代,直到A不再变化,就停止迭代;最后对A和X求并集则得到了填充的图像。

    数学表达式表示为:假定F是标记图像,边缘部分为1-I(x,y),
    在这里插入图片描述
    然后进行
    在这里插入图片描述H是一幅相当于I的填充了所有孔洞的二值图像。

    在MATLAB工具箱中可以使用函数imfill将所有的孔洞进行填充:

    g = imfill(f,'holes')
    

    在这里插入图片描述在这里插入图片描述
    观察图像发现,这个操作将原来是封闭部分的图像填充起来,完成孔洞填充的应用效果。但实验结果表明,要是孔洞不是完全封闭的,则该操作并不是将其填充起来。孔洞填充的前提是,图像是完全封闭的,才可以进行该操作。

    (3)清除边界物体

    重建的又一应用是清除图像中与边缘相接触的物体
    假定定义标记图像F为:
    在这里插入图片描述
    其中I是原始图像,然后以I为模板图像,重建
    在这里插入图片描述得到一幅图像H,清除边缘物体的图像。

    在MATLAB工具箱中可以使用函数imclearborder将图像边缘接触的物体清除:

    g = imclearborder(f,4) %conn的值默认是8,也可以选择4
    

    在这里插入图片描述在这里插入图片描述

    (六)灰度级形态学

    (1)膨胀和腐蚀

    用结构元b对灰度图像f的灰度进行膨胀,表示为:
    在这里插入图片描述
    可以将灰度膨胀简化为如下形式,这是使用平的结构元进行计算的:
    在这里插入图片描述
    在实验中,非平的结构元通过两个矩阵使用strel函数进行构造。这两个矩阵包括由结构元的域指定的0和1的矩阵和由高度值指定的矩阵,编写代码:

    b = strel([1 1 1],[1 2 1])
    

    在这里插入图片描述
    然而平坦的结构元也是通过函数strel构造的,编写实验代码:

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0906(a).tif');
    subplot(121),imshow(f),title('原始图像');
    se = strel('square',3);
    gd = imdilate(f,se);
    subplot(122),imshow(gd),title('膨胀后图像');
    

    在这里插入图片描述在这里插入图片描述
    用结构元b对灰度图像f的灰度进行腐蚀,表示为:
    在这里插入图片描述
    同理,通常灰度腐蚀使用的结构元时平的结构元,简化为:
    在这里插入图片描述
    编写实验代码:

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0917(a).tif');
    subplot(121),imshow(f),title('原始图像');
    ge = imerode(f,se);
    subplot(122),imshow(ge),title('腐蚀后图像');
    

    在这里插入图片描述在这里插入图片描述

    morph_grad = gd-ge;   %用于计算形态学的梯度
    imshow(morph_grad),title('形态学梯度')
    

    在这里插入图片描述在这里插入图片描述

    (2)开操作和闭操作

    在灰度图像中,开操作和闭操作的表达式与二值图像拥有一样的形式,表示为:
    (开操作)
    在这里插入图片描述
    (闭操作)
    在这里插入图片描述
    几何解释:假设图像函数f(x,y)用三维表面表示,然后b对f的开操作可以在几何上解释为推动结构元b,使之沿表面f的下沿平移,移过整个f的域。可以用下面的图像进一步理解:
    在这里插入图片描述开操作和闭操作应用于平滑图像、非均匀背景的补偿、粒度的测定

    编写实验一代码:平滑图像

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0925(a).tif');
    subplot(131),imshow(f),title('原始图像');
    se = strel('disk',5);
    fo = imopen(f,se);
    foc = imclose(fo,se);
    subplot(132),imshow(fo),title('用半径5的圆盘进行开操作图像');
    subplot(133),imshow(foc),title('再进行闭操作的图像');
    
    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0925(a).tif');
    subplot(131),imshow(f),title('原始图像');
    se = strel('disk',5);
    fc = imclose(f,se);
    fco = imopen(fc,se);
    subplot(132),imshow(fc),title('用半径5的圆盘进行开操作图像');
    subplot(133),imshow(fco),title('再进行闭操作的图像');
    
    fasf = f;   %交替顺序滤波
    for k = 2:5
    se = strel('disk',k);
    fasf = imclose(imopen(fasf,se),se);
    end
    

    在这里插入图片描述
    在这里插入图片描述进行交替顺序滤波后得到的结果:对比三幅图,看出交替顺序滤波后的图像更加平滑,图像也变得明亮一些。
    在这里插入图片描述
    编写实验二代码:非均匀背景补偿

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0926(a).tif');
    subplot(131),imshow(f),title('原始图像');
    se = strel('disk',10);
    fo = imopen(f,se);
    subplot(132),imshow(fo),title('开操作后图像');
    f2 = f - fo;
    f2 = imtophat(f,se);
    subplot(133),imshow(f2),title('阈值处理后图像');
    
    se = strel('disk',3);
    g = f + imtophat(f,se)-imbothat(f,se);  %顶帽变换减去底帽变化
    imshow(g)
    

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
    编写实验三代码:粒度测定

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0926(a).tif');
    imshow(f),title('原始图像')
    sumpixels = zeros(1,36);
    for k = 0:35
    se = strel('disk',k)
    fo = imopen(f,se);
    sumpixels(k+1) = sum(fo(:));
    end
    plot(0:35,sumpixels),xlabel('k'),ylabel('Surface area')
    
    plot(-diff(sumpixels))
    xlabel('k')
    ylabel('Surface area reduction')
    

    在这里插入图片描述
    在这里插入图片描述
    (相对于结构元半径的表面区域)
    在这里插入图片描述
    (相对于结构元半径的表面区域的减少)
    在这里插入图片描述

    (3)重建

    灰度重建和二值图像的重建是理论基本一样的,不同在于灰度图像中通常使用的结构是平坦结构元。形态学重建可以看作是对一个图像进行连续的膨胀操作,这个图像称之为标识图像marker。当连续的膨胀操作使得标识图像的轮廓匹配了另一个图像,重建过程结束,另一个图像便是掩模图像mark。

    编写实验一代码:使用形态学开操作重建图像

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0309(a).tif');
    subplot(131),imshow(f),title('原始图像');
    se =strel('disk',5);
    fe = imerode(f,se);
    subplot(132),imshow(fe),title('腐蚀过后图像');
    fobr = imreconstruct(fe,f);
    subplot(133),imshow(fobr),title('腐蚀后再重建的图像');
    
    fobrc = imcomplement(fobr);
    subplot(131),imshow(fobrc),title('补集的图像');
    fobrce = imerode(fobrc,se);
    subplot(132),imshow(fobrce),title('补集后腐蚀的图像');
    fobrcbr = imcomplement(imreconstruct(fobrce,fobrc));
    subplot(133),imshow(fobrcbr),title('补集后腐蚀再补集的图像');
    

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述编写实验二代码:使用重建移除复制的背景

    f =  imread('C:\Users\Public\Pictures\Sample Pictures\Fig0917(a).tif');
    subplot(131),imshow(f),title('原始图像');
    f_obr = imreconstruct(imerode(f,ones(1,71)),f);    %重建的开操作
    subplot(132),imshow(f_obr),title('重建后图像');
    f_o = imopen(f,ones(1,71));    %标准的开操作
    subplot(133),imshow(f_o),title('开操作图像');
    
    f_thr = f - f_obr;  %从原始图像中减去重建开操作
    f_th = f -f_o;    %从原始图像中减去标准开操作
    g_obr = imreconstruct(imerode(f_thr,ones(1,11)),f_thr);   %用水平线对f_thr的重建开操作
    g_obrd = imdilate(g_obr,ones(1,21));   %用水平线对g_obr进行膨胀处理
    f2 = imreconstruct(min(g_obrd,f_thr),f_thr);    %最后重建步骤
    subplot(221),imshow(f_th),title('变换后图像');
    subplot(222),imshow(g_obr),title('用水平线对f_thr的重建开操作后图像');
    subplot(223),imshow(g_obrd),title('用水平线对g_obr进行膨胀处理后图像');
    subplot(224),imshow(f2),title('再重建后图像');
    

    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

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

    千次阅读 2017-06-05 15:53:00
    形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。 基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换 几种算法进行组合,就可以实现一些非常复杂的功能,而且逻辑严密...
  • 小白学习图像处理——图像的形态学处理(MATLAB)

    万次阅读 多人点赞 2019-06-27 05:26:49
    腐蚀在数学形态学运算中的作用是消除物体的边界点。在数字图像处理中,对于确定的结构元素,通过腐蚀运算可以消除小于结构元素的点。同时,若一个目标区域中含有细小的连接部分,那么通过笃实处理可以对区域进行分割...
  • 上篇文章中,我们重点了解了腐蚀和膨胀这两种最基本的形态学操作,而运用这两个基本操作,我们可以实现更高级的形态学变换。 所以,本文的主角是OpenCV中的morphologyEx函数,它利用基本的膨胀和腐蚀技术,来执行...
  • 数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换...
  • 目录1.Objectives:2.Experiment Content:3.Experiment Principle:4.Experiment Steps Result and Conlusion:1、二值图像形态学变换2、对输入图像进行形态学操作,即腐蚀、膨胀、开运算和闭运算,改变结构元素...
  • 形态学图像处理(二)

    万次阅读 2016-12-31 21:38:10
    灰度图像形态学运算, 包括灰度腐蚀、灰度膨胀、灰度开和灰度闭 本章的典型案例分析 在人脸局部图像中定位嘴的中心 显微镜下图像的细菌计数 利用顶帽变换(top-hat)技术解决光照不均问题 细化算法“骨架”是指...
  • 第九章 形态学图像处理 第九章 形态学图像处理 一腐蚀和膨胀 1 腐蚀 2 膨胀 二开操作与闭操作 三击中或击不中变换 四一些基本的形态学算法 1 边界提取 2 孔洞填充 3 连通分量的提取 4 凸壳 5 细化 6 粗化 7 ...
  • 形态学图像处理之细化算法

    千次阅读 2019-09-01 19:53:46
    “骨架”是指一幅图像的骨骼部分,它描述物体的几何形状和拓扑结构,是重要的图像描绘子之一。计算骨架的过程一般称为“细化”或“骨架化”,在包括文字识别、工业零件形状识别以及印刷电路板自动检测在内的很多应用...
  • 在数字图像处理形态学运算中,常把一幅图像或者图像中一个我们感兴趣的区域称为集合,用大写字母A、B、C、D等表示;元素常指一个单个像素。用该像素在图像中的整型位置坐标z = (z1,z2)来表示。
  • 形态学图像处理-腐蚀和膨胀

    千次阅读 2010-12-28 17:31:00
    我想做一个关于形态学图像处理的专题,写一写我的想法,并且公开实现这些算法的代码。因为形态学图像处理的最基础方法就是腐蚀和膨胀,因此就从这两个方法开始。 腐蚀: 把结构元素S平移x后得到Sx,若Sx包含于X,...
  • 1.图像的细化主要是针对二值图而言,把输入的具有一定宽度的图像轮廓用逐次去掉边缘的方法最终变为宽度仅为一个像素的骨架。 2.所谓骨架,可以理解为图像的中轴,一个长方形的骨架,是它的长方形上的中轴线,圆的...
  • 形态学在数字图像处理中表示的是图像的数学形态里的内容,将数学形态学作为工具从图像中提取区域图像形状的有用的图像分量,如边缘、骨架,区域分割等。 如例: 如例: 如例: 2、数学形态学的语言是集合论。这个...
  • 腐蚀imerode(image, s) 对图像进行腐蚀操作f = imread('img8.tif'); se = strel('disk', 10); g = imerode(f, se); subplot(1, 2, 1), imshow(f), title('原图'); subplot(1, 2, 2), imshow(g), title('腐蚀后');...
  • 形态学图像处理之连通分量提取

    千次阅读 2019-09-01 17:11:33
    基本概念         提取连通分量的过程实际上也是标注连通分量的过程,通常的做法是给原图像...这里介绍一种基于形态学的膨胀操作的提取连通分量的方法。   &nbs...
  • 形态学图像处理之凸壳

    千次阅读 2019-09-02 21:59:19
    像素化操作首先需找到二值图像中所有的连通区域,然后用这些区域质心作为这些连通分量的代表,即将一个连通 区域像素化位于区域质心的一个像素。我们总是希望像素化算法能够找到物体的质心来代表该物体,但在实...
  • 形态学图像处理(matlab代码测试)

    千次阅读 2017-12-30 16:35:59
    形态学是提取图像特征的有力工具,针对二值图像和灰度图像的腐蚀、膨胀和重构的基本操作可以组合使用,以执行非常宽泛的任务。
1 2 3 4 5 ... 20
收藏数 19,314
精华内容 7,725
关键字:

形态学图像处理