有关opencv的学习(15)—图像的膨胀和腐蚀(1)

        膨胀、腐蚀属于形态学的操作, 简单来说就是基于形状的一系列图像处理操作。

        膨胀腐蚀是基于高亮部分(白色)操作的, 膨胀是対高亮部分进行膨胀, 类似“领域扩张”, 腐蚀是高亮部分被腐蚀, 类似“领域被蚕食”。

        膨胀腐蚀的应用和功能:  (1)、消除噪声(2)、分割独立元素或连接相邻元素(3)、寻找图像中的明显极大值、极小值区域(4)、求图像的梯度。

        其他相关:  开运算、闭运算;顶帽、黒帽;形态学梯度 ;

一、膨胀操作

        膨胀就是求局部最大值的操作, 从数学角度上来讲, 膨胀或腐蚀就是将图像(或区域)A与B进行卷积。

        核可以是任意大小和形状, 它有一个独立定义的参考点(锚点), 多数情况下, 核是一个小的中间带参考点和实心正方形或者圆盘, 可以看做是一个模板或掩码。

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


           函数原型为:

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,

                          Point anchor=Point(-1,-1), int iterations=1,

                          int borderType=BORDER_CONSTANT,

                          const Scalar& borderValue=morphologyDefaultBorderValue() );

src: 输入原图像(建议为二值图)。

dst: 输出图像要求和src一样的尺寸和类型。

kernel: 膨胀操作的核, 当为NULL时, 表示使用参考点位于中心的3x3的核一般使用getStructuringElement获得指定形状和尺寸的结构元素(核)可选以下三种形状: 矩形、交叉形、椭圆形。

anchor: 锚的位置, 默认值Point(-1,-1), 表示位于中心。

iterations: 膨胀的次数。

borderType: 边界模式, 一般采用默认值。

borderValue: 边界值, 一般采用默认值。

代码如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
//#include "onMouse.h"


using namespace cv;
using namespace std;


int main()
{
    Mat image=imread("/Users/zhangxiaoyu/Desktop/1.png",0);//0为读出的是灰度图像
    
    if(image.empty())
    {
        cout<<"Error!cannot be read...../n";
        return -1;
    }
    
    
    //膨胀图像
    cv::Mat dilated;
    cv::Mat element=getStructuringElement(MORPH_RECT, Size(7,7));
    cv::dilate(image, dilated, element);

    //显示原始图片
    cv::namedWindow("original image");
    cv::imshow("original image", image);

    
    
    //显示图片
    cv::namedWindow("dilated image");
    cv::imshow("dilated image",dilated );
    
    
    waitKey(0);
    return 0;

}

原始图像(灰度图像)如下:



膨胀后的图像为:



二、腐蚀操作

       腐蚀和膨胀相反, 是取局部最小值, 高亮区域逐渐减小, 如下图所示:


函数原型为:

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,

                         Point anchor=Point(-1,-1), int iterations=1,

                         int borderType=BORDER_CONSTANT,

                         const Scalar& borderValue=morphologyDefaultBorderValue() );

代码如下:

//腐蚀图像
    cv::Mat eroded;
    cv::Mat element=getStructuringElement(MORPH_RECT, Size(7,7));
    erode(image, eroded, element);

运行程序,如下图:


























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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值