opencv:图像的腐蚀与膨胀实现

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

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

  1. 消除噪声

  2. 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。

  3. 寻找图像中的明显的极大值区域或极小值区域

  4. 求出图像的梯度

opencv中使用到的函数:getStructuringElement、erode、dilate三个主要函数。getStructuringElement函数用于获取自定义的形状与尺寸内核,erode函数实现图像的腐蚀,dilate函数实现图像的膨胀。下面介绍三个函数的参数功能:

getStructuringElement(int shape, Size ksize, Point anchor)
  • shape:内核的形状,有三个参数选择:MORPH_RECT(矩形)、MORPH_CROSS(交叉形)、MORPH_ELLIPSE(椭圆形)。

  • ksize:内核大小

  • anchor:锚点 默认是Point(-1, -1)意思就是中心像素

erode( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), 
     int iterations=1,int borderType=BORDER_CONSTANT, const Scalar& 
     borderValue=morphologyDefaultBorderValue() )
  • src:原图像。

  • dst:目标图像。

  • element:腐蚀操作的内核。如果不指定,默认为一个简单的 3X3 矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement().

  • anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。

  • iterations:腐蚀次数。省略时为默认值1。

  • borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。

  • borderValue:边缘值

​dilate( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), 
       int iterations=1,int borderType=BORDER_CONSTANT, const Scalar& 
       borderValue=morphologyDefaultBorderValue() )
  • 该函数参数同erode函数参数,详见上述。

实现代码:

#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
​
int main()
{ 
  Mat srcImage = imread("cat_face.jpg");
  //获取自定义核
  Mat element1 = getStructuringElement(MORPH_RECT, Size(10, 10));
  Mat dst_erode;
​
  //用自定义的内核进行腐蚀操作
  erode(srcImage, dst_erode, element1);
​
  //获取自定义核
  Mat element2 = getStructuringElement(MORPH_RECT, Size(10, 10));
  Mat dst_dilate;
​
  //用自定义的内核进行膨胀操作
  dilate(srcImage, dst_dilate, element2);
​
  imshow("原图", srcImage);
  imshow("腐蚀效果图", dst_erode);
  imshow("膨胀效果图", dst_dilate);
  waitKey(0);
​
  return 0;
}

实现结果:

                              原图                                                       腐蚀结果图                                                      膨胀结果图

 

 

                                                                        "动动手指扫码或微信搜一搜关注哟"

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值