zoukankan      html  css  js  c++  java
  • 图像开运算和闭运算

    1、原理

    图像开运算与闭运算与膨胀和腐蚀运算有关,由膨胀和腐蚀两个运算的复合与集合操作(并、交、补等)组合成的运算构成。开运算与闭运算依据腐蚀和膨胀演变而来。

    1)开运算:先对图像腐蚀后膨胀。

    A○S= (AΘS)⊕ S

    作用:用来消除小的物体,平滑形状边界,并且不改变其面积。可以去除小颗粒噪声,断开物体之间的粘连。

    2)闭运算:先对图像膨胀后腐蚀

    A●S= (A⊕S)Θ S

    作用:用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。

    2、开运算的实现

    imgPath = 'E:opencv_picsrc_picpic2.bmp';
    img = imread(imgPath);
    img=rgb2gray(img);
    img = 255-img;
     
    se = strel('square', 5);
    img2 = imerode(img, se);
    img3 = imdilate(img2, se);
    subplot(1,3,1),imshow(img),title('原始图像');
    subplot(1,3,2),imshow(img2),title('腐蚀后');
    subplot(1,3,3),imshow(img3),title('膨胀后');

    效果如下图。腐蚀消除了小的噪点,保留了最大的一个噪点,膨胀之后还原了噪点的形状。图像上,草莓蒂上的小花纹已经消失。

     放大后观察,原图里有较大的斑点,6*5的方块(纵向缺1个点),腐蚀后只剩下1个点,膨胀后变为5*5的方块。

    放大到像素级可见,腐蚀图上的点(32,110)在膨胀图里被还原为5*5的块。

     使用imopen函数,效果相同。

    3、闭运算的实现

    imgPath = 'E:opencv_picsrc_picpic2.bmp';
    img = imread(imgPath);
    img=rgb2gray(img);
    img = 255-img;
     
    se = strel('square', 4);
    img2 = imdilate(img, se);
    img3 = imerode(img2, se);
    subplot(1,3,1),imshow(img),title('原始图像');
    subplot(1,3,2),imshow(img2),title('膨胀后');
    subplot(1,3,3),imshow(img3),title('腐蚀后');

    闭运算效果如下图。

    放大后,图像左侧的噪点在膨胀过程被连在一起,体积增大很多。腐蚀后形状发生了一些改变,体积变小很多。

    使用大小为15的结构元素,se = strel('square', 15);草莓中间的空心圈变为实心圈。膨胀过程中,空心被高亮白色填充,但是花瓣部分已经连接在一起形状发生了较大改变。再次腐蚀后,去掉了膨胀造成的粘连,花瓣部分大体形状恢复。

    在matlab里,使用imclose函数也可以达到上面先膨胀后腐蚀的效果。

    4、总结

    单独对比开运算和闭运算,对比图如下。

    开运算先腐蚀后膨胀,去除了小的黑点,方块边缘变得圆润了,也就是开运算对图像轮廓进行平滑。

    而闭运算先膨胀后腐蚀,把中心比较大的块连接为一个整体,填补了空白的缝隙。

    开运算能够除去孤立的小点,毛刺和小桥,而物体的形状轮廓基本不变。

    闭运算与开运算相反,能够填平前景物体内的小裂缝、间断和小孔,而总的位置和形状不变。

    结构元素大小的不同将导致滤波效果的不同。

    不同的结构元素的选择导致了不同的分割,即提取出不同的特征。

    5、参考文献

    1、形态学开运算闭运算

    https://www.jianshu.com/p/2eae48a44f83

    2、More Morphology Transformations

    https://docs.opencv.org/2.4/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html#more-morphology-transformations

    尊重原创技术文章,转载请注明。

    https://www.cnblogs.com/pingwen/p/12240890.html

  • 相关阅读:
    .net Core使用EFCore连接数据库
    前端实践项目(二)webpack生成html和外部引用
    前端实践项目(一)使用webpack进行打包编译
    消息队列的模式
    消息队列的应用场景
    .Net EasyNetQ的使用
    .Net中简单地使用RabbitMQ消息队列
    C# 虚函数virtual的使用之二
    C#之System.Object
    .Net EntityFramework(EF) CodeFirst模式
  • 原文地址:https://www.cnblogs.com/pingwen/p/12240890.html
Copyright © 2011-2022 走看看