精华内容
下载资源
问答
  • 理论 图像的腐蚀( Erosion )和膨胀( Dilation )是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。又出来新名词了:形态学。图像处理中指的形态学,往往表示的是数学形态学。数学形态学( ...
    e0d1aed10a6bc4855fd680c7c4afb340.png

    理论

    图像的腐蚀( Erosion )和膨胀( Dilation )是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。

    又出来新名词了:形态学。

    图像处理中指的形态学,往往表示的是数学形态学。数学形态学( Mathematical morphology ) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。

    没看懂没关系,上面那句概念出自「 OpenCV 3 入门编程 」,简单来讲,图像形态学就是改变图像的形状。

    图像形态学一些基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等等。

    ef06a6b202052bee4ce1c947de2b9982.png

    其中图像的膨胀和腐蚀是最基础的图像形态学操作,他们主要的功能如下:

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

    在接着往下看之前,有一点需要注意的是,图像的腐蚀与膨胀,主要针对的是二值图像(黑白图)的,其中进行变化的部分是图像的白色部分(高亮)部分,不是黑色部分。

    图像膨胀就是图像中的高亮部分进行膨胀,「领域扩张」,效果图拥有比原图更大的高亮区域。

    图像腐蚀就是原图中的高亮部分被腐蚀,「领域被蚕食」,效果图拥有比原图更小的高亮区域。

    图像腐蚀

    图像腐蚀其中有两个比较关键的输入对象,一个是二值图像,另一个是卷积核。

    卷积核是腐蚀中的关键,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为 1 时,其值才为 1 ,否则其值修改为 0 。

    下面是一个 5 * 5 的卷积核卷积的过程:

    058180bfbbd39313a3b3eb374f381b25.png

    OpenCV 为图像腐蚀提供的函数是:erode() ,它的原函数如下:

    def erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
    • src:原图像。
    • kernel:卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
    • iterations:迭代次数,默认是迭代一次,表示进行一次腐蚀,如有需要,可进行多次迭代腐蚀。

    示例代码如下:

    import cv2 as cv
    import numpy as np

    # 图像读取
    source = cv.imread("demo.png")

    # 设置卷积核
    kernel = np.ones((5, 5),np.uint8)

    # 进行图像腐蚀,默认迭代 1 次
    dst = cv.erode(source, kernel)

    # 图像显示
    cv.imshow("source", source)
    cv.imshow("dst", dst)

    # 等待操作
    cv.waitKey(0)
    cv.destroyAllWindows()
    ae357efca0e98ed92a2f1f4a6b6bd5cc.png

    我换一张图片迭代 5 次各位看下腐蚀的效果:

    dst = cv.erode(source, kernel, iterations=5)
    eca2d0bdd769681d772b07d65c586926.png

    图像膨胀

    图像膨胀正好和图像腐蚀相反,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只要有一个值为 1 时则为 1 ,否则为 0 。

    图像膨胀卷积核的卷积过程如下:

    5aa3b50bb3f532c410d0c143db68b585.png

    OpenCV 为图像腐蚀提供的函数是:dilate() ,它的原函数如下:

    def dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
    • src:原图像。
    • kernel:卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
    • iterations:迭代次数,默认是迭代一次,表示进行一次膨胀,如有需要,可进行多次迭代腐蚀。

    示例代码如下:

    import cv2 as cv
    import numpy as np

    # 图像读取
    source = cv.imread("demo.png", cv.IMREAD_GRAYSCALE)

    # 设置卷积核
    kernel = np.ones((5, 5),np.uint8)

    # 进行图像膨胀,默认迭代 1 次
    dst = cv.dilate(source, kernel)

    # 图像显示
    cv.imshow("source", source)
    cv.imshow("dst", dst)

    # 等待操作
    cv.waitKey(0)
    cv.destroyAllWindows()
    f6866340e8faa3486c792bba49e8a1cf.png

    可以看到,膨胀后的图像比膨胀前的图像整整胖了一圈。

    最后还是来个全家福,代码如下:

    import cv2 as cv
    import matplotlib.pyplot as plt
    import numpy as np

    # 读取图像
    source = cv.imread('demo.png', cv.IMREAD_GRAYSCALE)

    # 设置卷积核
    kernel = np.ones((5, 5),np.uint8)

    # 图像腐蚀
    erode_img = cv.erode(source, kernel)

    # 图像膨胀
    dilate_result = cv.dilate(source, kernel)

    # 显示结果
    titles = ['Source Img','Erode Img','Dilate Img']
    images = [source, erode_img, dilate_result]

    # matplotlib 绘图
    for i in range(3):
    plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

    plt.show()
    c41b8e62b2c41d6fcc833b1e634cdb0b.png

    示例代码

    如果有需要获取源码的同学可以在公众号回复「OpenCV」进行获取。

    感谢阅读b4a2b15cdb6be3ad3804b08de78d2c22.png

    bc6dcd9cf50152f579003b697c3e4175.gif

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

    今天,我们一起来学习图像形态学操作中两种最基本的形态学操作,即腐蚀与膨胀。

    一、理论

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

    腐蚀与膨胀主要实现以下功能:

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

    1、腐蚀

    腐蚀对图像求局部最小值;腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与卷积核(我们称之为B)进行卷积。

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

    1)腐蚀的数学表达式

    f800fbeefbe2dfdb608ec2cebf2f3459.png

    腐蚀的数学表达式

    2)腐蚀效果演示

    c3d083c17aa7765704f39f6a3cbbf477.png

    腐蚀效果演示

    3)腐蚀的作用:

    • 对象大小减小一个像素(3x3)
    • 平滑对象边缘
    • 弱化或者分割图像之间的半岛型连接

    2、膨胀

    膨胀对图像求局部的最大值;核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素;这样就会使图像中的高亮区域逐渐增长。

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

    1)膨胀的数学表达式

    ec618834ea6710d8c78d2ea31f195974.png

    膨胀的数学表达式

    e2e8f567bf643d0d3e1cda305986251a.png

    膨胀效果演示

    膨胀的作用:

    • 对象大小增加一个像素(3x3)
    • 平滑对象边缘
    • 减少或者填充对象之间的距离

    小结:

    可以看做膨胀是将白色区域扩大,腐蚀是将黑色区域扩大。

    二、OpenCV腐蚀与膨胀API函数详解

    1、腐蚀

    1)函数原型:

    void erode(InputArray src,  OutputArray dst,  InputArray kernel, Point anchor = Point(-1, -1),  int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue =  morphologyDefaultBorderValue());

    2)函数功能:

    用指定的卷积核腐蚀图像,使用像素邻域内的局部极小运算符来腐蚀一张图片,从src输入,由dst输出,支持就地(in-place)操作。

    3)参数详解:

    • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一;
    • 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型;
    • 第三个参数,InputArray类型的kernel,腐蚀操作的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵);
    • 第四个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于单位(element)的中心,我们一般不用管它;
    • 第五个参数,int类型的iterations,迭代使用erode()函数的次数,默认值为1;
    • 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT;
    • 第七个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。

    第三个参数一般用getStructuringElement()函数获取卷积核的大小;getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。

    其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:

    • 矩形: MORPH_RECT
    • 交叉形: MORPH_CROSS
    • 椭圆形: MORPH_ELLIPSE

    而getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。

    我们一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1, -1),表示锚点位于中心;并且需要注意,十字形的element形状唯一依赖于锚点的位置;而在其他情况下,锚点只是影响了形态学运算结果的偏移。

    4)实例:

    #include #include #include #include using namespace std;using namespace cv;int main(){ //载入原图  Mat image = imread("lena.png"); if (image.empty()) { printf("image error!"); return -1; } //创建窗口  namedWindow("【原图】腐蚀操作"); namedWindow("【效果图】腐蚀操作"); //显示原图 imshow("【原图】腐蚀操作
    展开全文
  • 基于 Matlab腐蚀膨胀的边缘检测 一实验目的 : 掌握运用 Matlab 软件对灰度与二值图像膨胀腐蚀处理方法 二实验环境(软件条件) Windws2000/XP MATLAB 7.x 三实验内容 1图像膨胀Matlab 实现 实验原理 ...
  • 【转载】:Matlab 图像处理 形态学 腐蚀 膨胀 开闭运算 连通分量 - yangyangyang20092010的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/yangyangyang20092010/article/details/8289572  形态学是提取...

    【转载】:Matlab 图像处理 形态学 腐蚀 膨胀 开闭运算 连通分量 - yangyangyang20092010的专栏 - 博客频道 - CSDN.NET  http://blog.csdn.net/yangyangyang20092010/article/details/8289572

          形态学是提取图像特征的有力工具,针对二值图像和灰度图像的腐蚀、膨胀和重构的基本操作可以组合使用,以执行非常宽泛的任务。其练习代码和结果如下:

     

      1 %% 第9章 形态学处理
      2 
      3 %% imdilate膨胀
      4 clc
      5 clear
      6 
      7 A1=imread('.\images\dipum_images_ch09\Fig0906(a)(broken-text).tif');
      8 info=imfinfo('.\images\dipum_images_ch09\Fig0906(a)(broken-text).tif')
      9 B=[0 1 0
     10    1 1 1
     11    0 1 0];
     12 A2=imdilate(A1,B);%图像A1被结构元素B膨胀
     13 A3=imdilate(A2,B);
     14 A4=imdilate(A3,B);
     15 
     16 subplot(221),imshow(A1);
     17 title('imdilate膨胀原始图像');
     18 
     19 subplot(222),imshow(A2);
     20 title('使用B后1次膨胀后的图像');
     21 
     22 subplot(223),imshow(A3);
     23 title('使用B后2次膨胀后的图像');
     24 
     25 subplot(224),imshow(A4);
     26 title('使用B后3次膨胀后的图像');
     27%imdilate图像膨胀处理过程运行结果如下:

     28 
     29 %% imerode腐蚀
     30 clc
     31 clear
     32 A1=imread('.\images\dipum_images_ch09\Fig0908(a)(wirebond-mask).tif');
     33 subplot(221),imshow(A1);
     34 title('腐蚀原始图像');
     35 
     36 %strel函数的功能是运用各种形状和大小构造结构元素
     37 se1=strel('disk',5);%这里是创建一个半径为5的平坦型圆盘结构元素
     38 A2=imerode(A1,se1);
     39 subplot(222),imshow(A2);
     40 title('使用结构原始disk(5)腐蚀后的图像');
     41 
     42 se2=strel('disk',10);
     43 A3=imerode(A1,se2);
     44 subplot(223),imshow(A3);
     45 title('使用结构原始disk(10)腐蚀后的图像');
     46 
     47 se3=strel('disk',20);
     48 A4=imerode(A1,se3);
     49 subplot(224),imshow(A4);
     50 title('使用结构原始disk(20)腐蚀后的图像');
     51 %图像腐蚀处理过程运行结果如下:
     52 
     53 %% 开运算和闭运算
     54 clc
     55 clear
     56 f=imread('.\images\dipum_images_ch09\Fig0910(a)(shapes).tif');
     57 %se=strel('square',5');%方型结构元素
     58 se=strel('disk',5');%圆盘型结构元素
     59 imshow(f);%原图像
     60 title('开闭运算原始图像')
     61%运行结果如下:

     62 
     63 %开运算数学上是先腐蚀后膨胀的结果
     64 %开运算的物理结果为完全删除了不能包含结构元素的对象区域,平滑
     65 %了对象的轮廓,断开了狭窄的连接,去掉了细小的突出部分
     66 fo=imopen(f,se);%直接开运算
     67 figure,subplot(221),imshow(fo);
     68 title('直接开运算');
     69 
     70 %闭运算在数学上是先膨胀再腐蚀的结果
     71 %闭运算的物理结果也是会平滑对象的轮廓,但是与开运算不同的是,闭运算
     72 %一般会将狭窄的缺口连接起来形成细长的弯口,并填充比结构元素小的洞
     73 fc=imclose(f,se);%直接闭运算
     74 subplot(222),imshow(fc);
     75 title('直接闭运算');
     76 
     77 foc=imclose(fo,se);%先开后闭运算
     78 subplot(223),imshow(foc);
     79 title('先开后闭运算');
     80 
     81 fco=imopen(fc,se);%先闭后开运算
     82 subplot(224),imshow(fco);
     83 title('先闭后开运算');
     84%开闭运算结果如下:

     85 
     86 %先膨胀再腐蚀
     87 fse=imdilate(f,se);%膨胀
     88 
     89 %gcf为得到当前图像的句柄,当前图像是指例如PLOT,TITLE,SURF等
     90 %get函数为得到物体的属性,get(0,'screensize')为返回所有物体screensize属性值
     91 %set函数为设置物体的属性
     92 figure,set(gcf,'outerposition',get(0,'screensize'));%具体目的是设置当前窗口的大小
     93 subplot(211),imshow(fse);
     94 title('使用disk(5)先膨胀后的图像');
     95 
     96 fes=imerode(fse,se);
     97 subplot(212),imshow(fes);
     98 title('使用disk(5)先膨胀再腐蚀后的图像');
     99%先膨胀后腐蚀图像如下:

    100 
    101 %先腐蚀再膨胀
    102 fse=imerode(f,se);
    103 figure,set(gcf,'outerposition',get(0,'screensize'))
    104 subplot(211),imshow(fse);
    105 title('使用disk(5)先腐蚀后的图像');
    106 
    107 fes=imdilate(fse,se);
    108 subplot(212),imshow(fes);
    109 title('使用disk(5)先腐蚀再膨胀后的图像');
    110%先腐蚀后膨胀的图像如下:

    111 
    112 %% imopen imclose在指纹上的应用
    113 clc
    114 clear
    115 f=imread('.\images\dipum_images_ch09\Fig0911(a)(noisy-fingerprint).tif');
    116 se=strel('square',3);%边长为3的方形结构元素
    117 subplot(121),imshow(f);
    118 title('指纹原始图像');
    119 
    120 A=imerode(f,se);%腐蚀
    121 subplot(122),imshow(A);
    122 title('腐蚀后的指纹原始图像');
    123%指纹原始图像和腐蚀后的图像结果如下:

    124 
    125 fo=imopen(f,se);
    126 figure,subplot(221),imshow(fo);
    127 title('使用square(3)开操作后的图像');
    128 
    129 fc=imclose(f,se);
    130 subplot(222),imshow(fc);
    131 title('使用square闭操作后的图像');
    132 
    133 foc=imclose(fo,se);
    134 subplot(223),imshow(foc);
    135 title('使用square(3)先开后闭操作后的图像')
    136 
    137 fco=imopen(fc,se);
    138 subplot(224),imshow(fco);
    139 title('使用square(3)先闭后开操作后的图像');
    140%指纹图像开闭操作过程结果如下:

    141 
    142 %% bwhitmiss击中或击不中变换
    143 clc
    144 clear
    145 f=imread('.\images\dipum_images_ch09\Fig0913(a)(small-squares).tif');
    146 imshow(f);
    147 title('击中或不击中原始图像');
    148%击中或不击中原始图像显示结果如下:

    149 
    150 B1=strel([0 0 0;0 1 1;0 1 0]);%击中:要求击中所有1的位置
    151 B2=strel([1 1 1;1 0 0;1 0 0]);%击不中,要求击不中所有1的位置
    152 B3=strel([0 1 0;1 1 1;0 1 0]);%击中
    153 B4=strel([1 0 1;0 0 0;0 0 0]);%击不中
    154 B5=strel([0 0 0;0 1 0;0 0 0]);%击中
    155 B6=strel([1 1 1;1 0 0;1 0 0]);%击不中
    156 
    157 g=imerode(f,B1)&imerode(~f,B2)%利用定义来实现击中或击不中
    158 figure,subplot(221),imshow(g);
    159 title('定义实现组1击中击不中图像');
    160 
    161 g1=bwhitmiss(f,B1,B2);
    162 subplot(222),imshow(g1);
    163 title('结构数组1击中击不中后的图像');
    164 
    165 g2=bwhitmiss(f,B3,B4);
    166 subplot(223),imshow(g2);
    167 title('结构数组2击中击不中的图像');
    168 
    169 g3=bwhitmiss(f,B5,B6);
    170 subplot(224),imshow(g3);
    171 title('结构数组3击中击不中的图像');
    172%击中击不中变换后图像如下:

    173 
    174 %%makelut
    175 clc
    176 clear
    177 
    178 f=inline('sum(x(:))>=3');%inline是用来定义局部函数的
    179 lut2=makelut(f,2)%为函数f构造一个接收2*2矩阵的查找表
    180 lut3=makelut(f,3)
    181 
    182 %% Conway生命游戏
    183 clc
    184 clear
    185 lut=makelut(@conwaylaws,3);
    186 bw1=  [0     0     0     0     0     0     0     0     0     0
    187        0     0     0     0     0     0     0     0     0     0
    188        0     0     0     1     0     0     1     0     0     0
    189        0     0     0     1     1     1     1     0     0     0
    190        0     0     1     0     0     0     0     1     0     0
    191        0     0     1     0     1     1     0     1     0     0
    192        0     0     1     0     0     0     0     1     0     0
    193        0     0     0     1     1     1     1     0     0     0
    194        0     0     0     0     0     0     0     0     0     0
    195        0     0     0     0     0     0     0     0     0     0  ];
    196 subplot(221),imshow(bw1,'InitialMagnification','fit');
    197 title('Generation 1');
    198 
    199 bw2=applylut(bw1,lut);
    200 subplot(222),imshow(bw2,'InitialMagnification','fit'),
    201 title('Generation 2');
    202 
    203 bw3=applylut(bw2,lut);
    204 subplot(223),imshow(bw3,'InitialMagnification','fit');
    205 title('Generation 3');
    206 
    207 temp=bw1;
    208 for i=2:100
    209     bw100=applylut(temp,lut);
    210     temp=bw100;
    211 end
    212 subplot(224),imshow(bw100,'InitialMagnification','fit')
    213 title('Generation 100');
    214%显示Generation结果如下:

    215 
    216 %% getsequence
    217 clc
    218 clear
    219 se=strel('diamond',5)
    220 decomp=getsequence(se)%getsequence函数为得到分解的strel序列
    221 decomp(1)
    222 decomp(2)
    223 
    224 %% endpoints
    225 clc
    226 clear
    227 
    228 f1=imread('.\images\dipum_images_ch09\Fig0914(a)(bone-skel).tif');
    229 subplot(121),imshow(f1);
    230 title('原始形态骨架图像');
    231 
    232 g1=endpoints(f1);
    233 %set(gcf,'outerposition',get(0,'screensize'));%运行完后自动生成最大的窗口
    234 subplot(122),imshow(g1);
    235 title('骨架图像的端点图像');
    236 %骨架头像端点检测头像如下:
    237 
    238 f2=imread('.\images\dipum_images_ch09\Fig0916(a)(bone).tif');
    239 figure,subplot(121),imshow(f2);
    240 title('原始骨头图像');
    241 
    242 g2=endpoints(f2);
    243 subplot(122),imshow(g2);
    244 title('骨头图像端点头像');%结果是没有端点
    245%骨头头像端点检测图像如下:

    246 
    247 %% bwmorph组合常见形态学之细化
    248 clc
    249 clear
    250 f=imread('.\images\dipum_images_ch09\Fig0911(a)(noisy-fingerprint).tif');
    251 subplot(221),imshow(f);
    252 title('指纹图像细化原图');
    253 
    254 g1=bwmorph(f,'thin',1);
    255 subplot(222),imshow(g1);
    256 title('指纹图像细化原图');
    257 
    258 g2=bwmorph(f,'thin',2);
    259 subplot(223),imshow(g2);
    260 title('指纹图像细化原图');
    261 
    262 g3=bwmorph(f,'thin',Inf);
    263 subplot(224),imshow(g3);
    264 title('指纹图像细化原图');
    265%指纹图像细化过程显示如下:

    266 
    267 %% bwmorph组合常见形态学之骨骼化
    268 clc
    269 clear
    270 f=imread('.\images\dipum_images_ch09\Fig0911(a)(noisy-fingerprint).tif');
    271 subplot(131),imshow(f);
    272 title('指纹图像骨骼化原图');
    273 
    274 fs=bwmorph(f,'skel',Inf);
    275 subplot(132),imshow(fs);
    276 title('指纹图像骨骼化');
    277 
    278 for k=1:5
    279     fs=fs&~endpoints(fs);
    280 end
    281 subplot(133),imshow(fs);
    282 title('指纹图像修剪后骨骼话');
    283%指纹图像骨骼化过程显示:

    284 
    285 %% 使用函数bwlabel标注连通分量
    286 clc
    287 clear
    288 f=imread('.\images\dipum_images_ch09\Fig0917(a)(ten-objects).tif');
    289 imshow(f),title('标注连通分量原始图像');
    290%其结果显示如下:

    291 
    292 [L,n]=bwlabel(f);%L为标记矩阵,n为找到连接分量的总数
    293 [r,c]=find(L==3);%返回第3个对象所有像素的行索引和列索引
    294 
    295 rbar=mean(r);
    296 cbar=mean(c);
    297 
    298 figure,imshow(f)
    299 hold on%保持当前图像使其不被刷新
    300 for k=1:n
    301     [r,c]=find(L==k);
    302     rbar=mean(r);
    303     cbar=mean(c);
    304     plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k',...
    305          'MarkerFaceColor','k','MarkerSize',10);%这个plot函数用法不是很熟悉
    306     plot(cbar,rbar,'Marker','*','MarkerFaceColor','w');%其中的marker为标记
    307 end
    308 title('标记所有对象质心后的图像');

    309 
    310 %% 由重构做开运算
    311 clc
    312 clear
    313 f=imread('.\images\dipum_images_ch09\Fig0922(a)(book-text).tif');
    314 subplot(321),imshow(f);
    315 title('重构原始图像');
    316 
    317 fe=imerode(f,ones(51,1));%竖线腐蚀
    318 subplot(322),imshow(fe);
    319 title('使用竖线腐蚀后的结果');
    320 
    321 fo=imopen(f,ones(51,1));%竖线做开运算
    322 subplot(323),imshow(fo);
    323 title('使用竖线做开运算结果');
    324 
    325 fobr=imreconstruct(fe,f);%fe做标记
    326 subplot(324),imshow(fobr);
    327 title('使用竖线做重构开运算');
    328 
    329 ff=imfill(f,'holes');%对f进行孔洞填充
    330 subplot(325),imshow(ff);
    331 title('对f填充孔洞后的图像');
    332 
    333 fc=imclearborder(f,8);%清除边界,2维8邻接
    334 subplot(326),imshow(fc);
    335 title('对f清除边界后的图像');
    336%图像重构过程显示如下:

    337 
    338 %% 使用顶帽变换和底帽变换
    339 clc
    340 clear
    341 f=imread('.\images\dipum_images_ch09\Fig0926(a)(rice).tif');
    342 subplot(221),imshow(f);
    343 title('顶帽底帽变换原始图像');
    344 
    345 se=strel('disk',10);%产生结构元素
    346 %顶帽变换是指原始图像减去其开运算的图像
    347 %而开运算可用于补偿不均匀的背景亮度,所以用一个大的结构元素做开运算后
    348 %然后用原图像减去这个开运算,就得到了背景均衡的图像,这也叫做是图像的顶帽运算
    349 f1=imtophat(f,se);%使用顶帽变换
    350 subplot(222),imshow(f1);
    351 title('使用顶帽变换后的图像');
    352 
    353 %底帽变换是原始图像减去其闭运算后的图像
    354 f2=imbothat(imcomplement(f),se);%使用底帽变换,为什么原图像要求补呢?
    355 %f2=imbothat(f,se);%使用底帽变换
    356 subplot(223),imshow(f2);
    357 title('使用底帽变换后的图像');
    358 
    359 %顶帽变换和底帽变换联合起来用,用于增加对比度
    360 f3=imsubtract(imadd(f,imtophat(f,se)),imbothat(f,se));%里面参数好像不合理?
    361 subplot(224),imshow(f3);
    362 title('使用顶帽底帽联合变换后图像');
    363%顶帽底帽变换过程图像如下:

    364 
    365 %%使用开运算和闭运算做形态学平滑
    366 %由于开运算可以除去比结构元素更小的明亮细节,闭运算可以除去比结构元素更小的暗色细节
    367 %所以它们经常组合起来一起进行平滑图像并去除噪声
    368 clc
    369 clear
    370 f=imread('.\images\dipum_images_ch09\Fig0925(a)(dowels).tif');
    371 subplot(221),imshow(f);
    372 title('木钉图像原图');
    373 
    374 se=strel('disk',5);%disk其实就是一个八边形
    375 fo=imopen(f,se);%经过开运算
    376 subplot(222),imshow(f);
    377 title('使用半径5的disk开运算后的图像');
    378 
    379 foc=imclose(fo,se);
    380 subplot(223),imshow(foc);
    381 title('先开后闭的图像');
    382 
    383 fasf=f;
    384 for i=2:5
    385     se=strel('disk',i);
    386     fasf=imclose(imopen(fasf,se),se);
    387 end
    388 subplot(224),imshow(fasf);
    389 title('使用开闭交替滤波后图像');
    390%使用开运算和闭运算做形态学平滑结果如下:

    391 
    392 %% 颗粒分析
    393 clc
    394 clear
    395 f=imread('.\images\dipum_images_ch09\Fig0925(a)(dowels).tif');
    396 
    397 sumpixels=zeros(1,36);
    398 for k=0:35
    399     se=strel('disk',k);
    400     fo=imopen(f,se);
    401     sumpixels(k+1)=sum(fo(:));
    402 end
    403 
    404 %可以看到,连续开运算之间的表面积会减少
    405 plot(0:35,sumpixels),xlabel('k'),ylabel('surface area');
    406 title('表面积和结构元素半径之间的关系');
    407%其运算结果如下:   

    408 
    409 figure,plot(-diff(sumpixels));%diff()函数为差分或者近似倒数,即相邻2个之间的差值
    410 xlabel('k'),ylabel('surface area reduction');
    411 title('减少的表面积和结构元素半径之间的关系');
    412%其运算结果如下:

    413 
    414 %% 使用重构删除复杂图像的背景
    415 clc
    416 clear
    417 f=imread('.\images\dipum_images_ch09\Fig0930(a)(calculator).tif');
    418 subplot(221),imshow(f);
    419 title('灰度级重构原图像');
    420 
    421 f_obr=imreconstruct(imerode(f,ones(1,71)),f);
    422 subplot(222),imshow(f_obr);
    423 title('经开运算重构图');
    424 
    425 f_o=imopen(f,ones(1,71));
    426 subplot(223),imshow(f_o);
    427 title('经开运算后图');
    428 
    429 f_thr=imsubtract(f,f_obr);
    430 subplot(224),imshow(f_thr);
    431 title('顶帽运算重构图')
    432%使用重构删除复杂图像的背景1:

    433 
    434 f_th=imsubtract(f,f_o)
    435 figure,subplot(221),imshow(f_th);
    436 title('经顶帽运算图');
    437 
    438 g_obr=imreconstruct(imerode(f_thr,ones(1,11)),f_thr);
    439 subplot(222),imshow(g_obr);
    440 title('用水平线对f_thr经开运算后重构图');
    441 
    442 g_obrd=imdilate(g_obr,ones(1,2));
    443 subplot(223),imshow(g_obrd);
    444 title('使用水平线对上图进行膨胀');
    445 
    446 f2=imreconstruct(min(g_obrd,f_thr),f_thr);
    447 subplot(224),imshow(f2);
    448 title('最后的重构结果');
    449%使用重构删除复杂图像的背景2:

     

        形态学这一章很有用,因为它还可以应用在图像分割中。

     


    展开全文
  • 图像腐蚀膨胀我们在前两次教程中概述了OpenCV对于图像的滤波,通常对于一个实战项目而言,滤波之后的下...而我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。数学形态学是...

    图像腐蚀与膨胀

    我们在前两次教程中概述了OpenCV对于图像的滤波,通常对于一个实战项目而言,滤波之后的下一步操作就是图像的形态学处理了,从本次教程开始,我们正式步入了OpenCV图像形态学处理的部分。

    形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。

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

    简单来讲,形态学操作就是基于形状的一系列图像处理操作。OpenCV为进行图像的形态学变换提供了快捷、方便的函数。最基本的形态学操作有二种,他们是:膨胀与腐蚀(Dilation与Erosion)。

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

    • 消除噪声。

    • 分割出独立的图像元素,在图像中连接相邻的元素。

    • 寻找图像中的明显的极大值区域或极小值区域。

    • 求出图像的梯度。

    腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。

    ▼ 膨胀

    其实,膨胀就是求局部最大值的操作。

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

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

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

    0f6522256cf7f86b13221207d258b0b9.png

    我们来看一下函数原型:

    cv2. dilate (img,kernel,iterations)->dst

    • 第一个参数:img指需要膨胀的图。

    • 第二个参数:kernel指膨胀操作的内核,默认是一个简单的3X3矩阵,我们也可以利用getStructuringElement()函数指明它的形状。

    • 第三个参数:iterations指的是膨胀次数,省略是默认为1。

    • dst则为返回的图像。

    定义卷积核需要用到Numpy中的函数,它可以定义一个矩形的卷积核结构元素,我们来看一下代码:

    import cv2import numpy as npimg = cv2.imread('01.jpg',0)kernel = np.ones((5,5),np.uint8)dict = cv2.dilate(img,kernel,iterations = 1)cv2.imshow("org",img)cv2.imshow("result", dict)cv2.waitKey(0)cv2.destroyAllWindows()

    我们定义了一个5*5的矩形卷积核,效果:

    a4bcb163f257ded3a312bdbd735fd637.png

    事实上,在某些情况下,我们可能需要椭圆形/圆形的内核。因此,为此,OpenCV具有一个函数cv.getStructuringElement()。我们只需传递内核的形状和大小,即可获得所需的内核,函数原型:

    retval=cv.getStructuringElement(shape, ksize[, anchor])

    • 这个函数的第一个参数表示内核的形状,有三种形状可以选择。

    • 矩形:MORPH_RECT

    • 交叉形:MORPH_CROSS

    • 椭圆形:MORPH_ELLIPSE

    8169c4bb48383eabc3d4dc3103c63e30.png

    第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个变量来获得。

    getStructuringElement函数的返回值: 对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。

    我们看一下代码:

    import cv2import numpy as npimg = cv2.imread('01.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))dict = cv2.dilate(img,kernel,iterations = 1)cv2.imshow("org",img)cv2.imshow("result", dict)cv2.waitKey(0)cv2.destroyAllWindows()

    至于卷积核的形状我在这里选择了椭圆形,大家可以自己选择其他形状进行实验:

    69288d4c4bcf02ded6ed2226f4d2b8d6.png

    ▼ 腐蚀

    再来看一下腐蚀,膨胀和腐蚀是一对好友,是相反的一对操作,所以腐蚀就是求局部最小值的操作。我们一般都会把腐蚀和膨胀对应起来理解和学习。下文就可以看到,两者的函数原型也是基本上一样的。

    d0f7748977ebba99818a51303afb596d.png

    我们来看一下函数原型:

    cv2.erode(img,kernel,iterations)->dst

    • 第一个参数:img指需要腐蚀的图。

    • 第二个参数:kernel指腐蚀操作的内核,默认是一个简单的3X3矩阵,我们也可以利用getStructuringElement()函数指明它的形状。

    • 第三个参数:iterations指的是腐蚀次数,省略是默认为1。

    • dst则为返回的图像。

    代码:

    import cv2import numpy as npimg = cv2.imread('01.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))erode = cv2.erode(img,kernel,iterations = 1)cv2.imshow("org",img)cv2.imshow("result", erode)cv2.waitKey(0)cv2.destroyAllWindows()

    效果:

    97821920f3ec0f5ac7465b7fc08777bf.png

    腐蚀与膨胀是形态学处理中的基础操作,它们有着很重要的作用,也是后面开操作与闭操作的基础,所以必须熟练运用。

    开运算与闭运算

    图像的腐蚀与膨胀是本次教程的核心——开运算与闭运算的基础,如果结构元素为圆形, 则膨胀操作可填充图像中比结构元素小的孔洞以及图像边缘处小的凹陷部分。而腐蚀可以消除图像中的毛刺及细小连接成分, 并将图像缩小, 从而使其补集扩大。但是, 膨胀和腐蚀并非互为逆运算, 所以它们可以结合使用。在腐蚀和膨胀两个基本运算的基础上, 可以构造出形态学运算簇, 它由膨胀和腐蚀两个运算的复合与集合操作(并、 交、 补等)组合成的所有运算构成。例如, 可使用同一结构元素, 先对图像进行腐蚀然后膨胀其结果, 该运算称为开运算;或先对图像进行膨胀然后腐蚀其结果, 称其为闭运算。开运算和闭运算是形态学运算族中两种最为重要的运算。

    对于图像X及结构元素S, 用符号2344778e7e79f3b2826214b620adb77b.png表示S对图像X作开运算, 用符号339ea708bcb41c48e4b6de103f4b7b98.png表示S对图像X作闭运算, 它们的定义为:

    b7a962a6c79a392afeeec78e26abd22c.png

    首先需要来了解一个函数:

    cv2.morphologyEx(src, op, kernel)

    • src传入的图片。

    • op进行变化的方式。

    • kernel表示定义的卷积核的大小以及形状。

    • op =  cv2.MORPH_OPEN 进行开运算,指的是先进行腐蚀操作,再进行膨胀操作。

    • op = cv2.MORPH_CLOSE 进行闭运算, 指的是先进行膨胀操作,再进行腐蚀操作。

    ▼ 开运算

    开运算指的就是对图像先进行腐蚀操作,然后再进行膨胀操作,而通常情况下,它是对图像的明亮的区域进行操作,可以消除图像中的白噪声,现在我们来看例子,先看一幅图像:

    56591addde75a5537b0096e514abc173.png

    现在我们想要消除图像中的黑色的毛刺,但是如果直接对图像进行开运算是不行的,因为开运算是对图像的明亮区域进行操作,看一下直接进行开运算会有什么效果:

    import cv2import numpy as npimg = cv2.imread('open.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))open =cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)cv2.imshow("img",img)cv2.imshow("result", open)cv2.waitKey(0)cv2.destroyAllWindows()

    a10f1e325bfa7fb2b78b279a8bc8666d.png

    可以看到,图像的毛刺没有被去除,现在我们需要将原图进行阈值化翻转,也就是黑白颠倒,这样才方便进行形态学的处理,我们在前面阈值部分讲过,这里就不再讲述了,直接看代码:

    import cv2import numpy as npimg = cv2.imread('open.jpg',0)threshold = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]cv2.imshow("img",img)cv2.imshow("thres",threshold)cv2.waitKey(0)cv2.destroyAllWindows()

    433d9e0b346635dec390e6e4c27fa3f5.png

    现在图像已经被黑白颠倒了过来,现在我们可以开始进行开运算了,当然首先也是需要定义一个卷积核的,这在上个教程中已经谈到,在这里我们定义一个3*3的矩形卷积核:

    import cv2import numpy as npimg = cv2.imread('open.jpg',0)threshold = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))open =cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)cv2.imshow("img",img)cv2.imshow("thres",threshold)cv2.imshow("result", open)cv2.waitKey(0)cv2.destroyAllWindows()

    0e3083f099159980c3b7193a131de194.png

    这样效果就显而易见了,如果我们将卷积核改成5*5的呢:

    import cv2import numpy as npimg = cv2.imread('open.jpg',0)threshold = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))open =cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)cv2.imshow("thres",threshold)cv2.imshow("result", open)cv2.waitKey(0)cv2.destroyAllWindows()

    7f211d5be056b39916578897abfb082d.png

    这就说明操作过度了,所以对于形态学处理卷积核的适当选取是非常重要的,现在我们对处理之后的图像进行还原:

    import cv2import numpy as npimg = cv2.imread('open.jpg',0)threshold = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))open =cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)result = cv2.threshold(open,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]cv2.imshow("img",img)cv2.imshow("thres",threshold)cv2.imshow("open", open)cv2.imshow("result",result)cv2.waitKey(0)cv2.destroyAllWindows()

    看一下最终还原的结果:

    0b95591effd89db8b991e40a1cb3de22.png

    事实上,卷积核的灵活运用将会极大的方便图像的形态学处理,我们来进行一个实战,比如现在给出一幅图像:

    681d0d13fb979e219e79a8c683f3ad3a.png

    我们将用开运算分别提炼出横线和竖线,我们使用13*1的卷积核进行实验:

    import cv2import numpy as npimg = cv2.imread('hengshu.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(13,1))open =cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)cv2.imshow("img",img)cv2.imshow("open", open)cv2.waitKey(0)cv2.destroyAllWindows()

    f422f2837d4c6a956ac97eeb629c49b6.png

    是不是很神奇,现在我们使用1*13的卷积核进行实验:

    import cv2import numpy as npimg = cv2.imread('hengshu.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,13))open =cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)cv2.imshow("img",img)cv2.imshow("open", open)cv2.waitKey(0)cv2.destroyAllWindows()

    8cdace3044400af1970257fbfbe19783.png

    竖线也被完美的提取出来了,在以后的项目实战中,我们将会用到这些知识,合理的过滤掉图像中多余的信息,事实上,我们还发现,处理之后的图像偏暗,没有原图那么明亮,这在下次教程中的顶帽——黑帽操作中可以进行处理。

    ▼ 闭运算

    我们折腾了半天的开运算,现在我们来玩玩闭运算,闭运算跟开运算相反,是先膨胀再腐蚀,它通常被用来去除图像明亮区域内部的噪声。我们来看一幅图像:

    279e00dd0051156e09d372a0ae851850.png

    现在我们将要用闭运算去除图像明亮区域内部的黑点,定义一个7*7的卷积核,我们看代码:

    import cv2import numpy as npimg = cv2.imread('close.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))open =cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)cv2.imshow("img",img)cv2.imshow("open", open)cv2.waitKey(0)cv2.destroyAllWindows()

    9fd66fd88b2ae3ae89187bb485126ae3.png

    可以看到,效果很好,现在我们来进行另一个具有实战意义的实验,先看图片:

    6cc7834d2f78a6989f00066a6e356d5a.png

    我们需要将这些字轮廓提炼出来,并且用方框标定出来,每一行字用一个方框标定出来,当然,这个涉及到以后将要讲解的轮廓提取以及轮廓近似,但是在这里我们先进行一个实验,如果我们想将每一行字用一个方框标定出来,那么首先需要满足的条件就是每一行的字必须连在一块,形成一个整体,这样的话才可以用OpenCV提取他们整体的轮廓,进而标定出来,但现在我们看到这些字都是独立的,它们并没有连在一起,这个时候我们就可以采用闭运算了。

    我们来看代码:

    import cv2import numpy as npimg = cv2.imread('text1.jpg',0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(21,5))open =cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)cv2.imshow("img",img)cv2.imshow("open", open)cv2.waitKey(0)cv2.destroyAllWindows()

    b0f7411c648ac6c3e5d2d1b2773b36a1.png

    这样的话所有的字体连在一起,这也方便了后期的轮廓提取。

    我在这里给出综合代码,大家可以玩玩:

    import cv2import numpy as npimg = cv2.imread('text1.jpg')test = img.copy()gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 5))close = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)contour, _ = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(test, contour, -1, (0, 0, 255), 2)for c in contour:x, y, w, h = cv2.boundingRect(c)cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imshow("result", img)cv2.imshow("test",test)cv2.imshow("close", close)cv2.waitKey(0)cv2.destroyAllWindows()

    a9f438d05fec014b32f56f5df9368c4b.png

    第一个图是对图像的轮廓进行提取,第二个则是提取轮廓的外接矩形,是不是很有意思,这在以后都会慢慢讲述。

    闭运算一般则被用于处理内部噪声情况,开运算处理外部噪声情况,所以合理的运用它们是非常重要的。

    66e3fcab0a86ce8cf83534550aa7bae3.gif9b3571d6d1c8239f2e9a1ed8f545116c.png扫码入群扫码添加管理员微信

    加入“电子产品世界”粉丝交流群

    ↓↓↓↓点击,查看更多新闻

    展开全文
  • 图像形态学处理的概念 数字图像处理中的形态学处理是指将数字形态学作为工具从图 像中提取对于表达和描绘区域形状有用处的图像分量比如边 界骨架以及凸壳还包括用于预处理或后处理的形态学过滤 细化和修剪等图像形态...
  • 图像处理 膨胀腐蚀 matlab算法实现
  • 图像处理matlab腐蚀膨胀

    热门讨论 2009-04-03 11:51:43
    不是直接的函数调用,老师不让直接调用是根据腐蚀膨胀的原理自己编的小程序.
  • 数学形态学具有腐蚀膨胀,开运算和闭运算四种基本运算;...本文以腐蚀膨胀为基础,同时也运用以腐蚀膨胀为基础的其他操作,利用MATLAB图像处理工具箱中的函数对麦积山佛半身图像进行了处理。
  • 1.膨胀 strel函数是创造一个形态学结构元素,常见的二维形态学结构元素如图所示,也可以自己设计。 膨胀填充了图像小孔 2.腐蚀 y = imerode(x,strel) 用法与膨胀相同 ...
  • img_gray=imread('rice.png');img_erzhi=imread('testpat1.png');imshow(img_gray)figure,imshow(img_erzhi)[mn]=size(img_gray);img_gray_fu=zeros(m,n);img_gray_peng=zeros(m,n);img_erzhi_fu=zeros(m,n);...
  • img_gray=imread'rice.png; img_erzhi=imread'testpat1.png; imshow(img_gray) figure,imshow(img_erzhi) [m n]=size(img_gray; img_gray_fu=zeros(m,n; img_gray_peng=zeros(m,n; img_erzhi_fu=zeros(m,n;...
  • 参考前一篇:matlab图像处理--膨胀腐蚀 https://mp.csdn.net/console/editor/html/105622640 左边是一个二值化的测试图像,白色为图像元素,黑色为背景;右边是经过腐蚀后的结果图像 下面是测试用的matlab...
  • Matlab 基于腐蚀膨胀的边缘检测 文/天神 一.课题背景 形态学运算只针对二值图像二进制图像并依据数学形态学Mathermatical Morphogy集合论方法发展起来 的图像处理方法起源于岩相对岩石结构的定量描述工作在数字...
  • 是个GUI界面。进行了中值滤波,范围默认为3*3,...利用类间方差阈值算法实现图像的分割处理,利用形态学中的腐蚀膨胀处理进行处理结果修正。注意,本程序用的滤波、分割、形态学处理等都是调用的matlab自带的函数。
  • 图像腐蚀图像膨胀Matlab代码

    热门讨论 2008-12-28 22:10:16
    该代码首先实现了图像腐蚀处理图像膨胀处理。然后,经过先腐蚀(Erosion)处理,后膨胀(Dilation)处理得到了Opening Image;又经过先膨胀(Dilation)处理,后腐蚀(Erosion)处理得到了Closing Image。 程序执行后...
  • 左边是一个二值化的测试图像,白色为图像元素,黑色为背景;右边是经过膨胀后的结果图像 下面是测试用的matlab代码,代码中...%手动实现膨胀腐蚀 img=imread('ces2.bmp'); %关于img:img图像中进行了二值化...
  • 本篇文章要分享的是基于MATLAB腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作。什么是二值图像呢?把一...
  • matlab 图像膨胀indilate和腐蚀imerode

    万次阅读 多人点赞 2014-11-04 10:51:14
    1.图像膨胀Matlab实现: 可以使用imdilate函数进行图像膨胀,imdilate函数需要两个基本输入参数,即待处理的输入图像和结构元素对象。结构元素对象可以是strel函数返回的对象,也可以是一个自己定义的表示结构...
  • 形态学处理方法听起来很高大上,实际计算过程很容易,本人觉得比较难的是如何把各个方法对应的处理效果记住。在此整理了学习过程中的一些...举个例子给定一个矩阵,也就是我们要做处理图像 ,以及一个十字交叉结构...
  • matlab 图像处理尝试

    2019-11-15 16:58:37
    matlab 图像处理尝试 目录 1 对图像进行二值化处理以及高斯滤波 2 对图像进行连通域面积统计,去除面积不足的区域 3 图像腐蚀膨胀基本概念,图像开运算、闭运算基本概念。图像开运算闭运算和腐蚀膨胀的关系。 matlab...
  • 本篇文章要分享的是基于MATLAB腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作。 什么是二值图像呢?把...
  • 用于图像处理Matlab腐蚀膨胀的边缘检测方法
  • 数学形态学是一种应用于图像处理和模式识别的方法,基本思想是用具有一定形态的结构元素去度量和提取图像中对应的形状以达到对图像分析和识别的目的,利用数学形态学对物体的几何结构分析过程就是把主体和客体相互...
  • VC++ matlab图像处理

    2013-09-15 15:17:54
    8.2.2 数字图像处理的主要内容 8.3 图像文件格式 8.4 图像类型 8.4.1 索引图像 8.4.2 灰度图像 8.4.3 RGB 图像 8.4.4 二值图像 8.4.5 图像序列 8.4.6 图形类型判断 8.5 图像类型转换 8.5.1 dither 函数 ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 188
精华内容 75
关键字:

matlab图像处理腐蚀膨胀

matlab 订阅