opencv笔记(十七)——形态学操作(膨胀、腐蚀、开、闭操作)

一、设置结构元素:getStructuringElement

  图像处理经常要用到形态学操作,其中首先要获取结构元素。包括结构元素的大小及形状。

    OpenCV提供了一个函数getStructuringElement,可以获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。 

C++:Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))
Python: cv2.getStructuringElement(shape, ksize[, anchor]) → retval

第一个参数:结构单元的形状。第二个参数:结构参数的尺寸。第三个参数:锚点位置(默认结构单元的中心)
(1)shape:
MORPH_RECT:矩形
MORPH_ELLIPSE:椭圆
MORPH_CROSS:十字形

(2)ksize:
核大小

(3)Point(x,x):

结构元的大小

二、设置相应的操作 

2.1 膨胀、腐蚀

腐蚀:

    erode(srcImage, dstImage, element);

     imshow("图片名", 待显示照片);

膨胀:

    dilate(待处理图片, 处理好的图片名字, 结构元);
    imshow("膨胀(5*5)", Ero);

2.1.1腐蚀的作用

    1、边缘检测。 
    2、噪声滤除。 
    3、形态骨架提取。

这一操作可以扩大低像素值区域。相当于”最小值“滤波器

2.1.2膨胀的作用

将卷积核B滑过图像A,找出卷积核区域内最大像素值作为锚点像素值。这一操作可以缩小低像素值区域。相当于“最大值”滤波器

膨胀腐蚀的函数实现:

https://blog.csdn.net/hx1298234467/article/details/48677737

2.2 开运算、闭运算、形态梯度...

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

src:输入图像
dst:结果图像
op:操作

MORPH_OPEN开运算:先对图像腐蚀,再膨胀

MORPH_CLOSE闭运算:先膨胀再腐蚀

MORPH_GRADIENT形态梯度:膨胀图和腐蚀图之差

MORPH_TOPHAT顶帽:原图和开运算图之差

MORPH_BLACKHAT黑冒:闭运算结果和原图之差

#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>


using namespace cv;
using namespace std;

int main(int argc, char* argv[]){
    const char* path = "";
    Mat img = imread(path);
    if (!img.data){
        cout << "Wrong Image" << endl;
        return -1;
    }

    Mat kern = getStructuringElement(MORPH_RECT, Size(5, 5));

    Mat erosion_img, dilate_img;
    //腐蚀
    erode(img, erosion_img, kern);
    //膨胀
    dilate(img, dilate_img, kern);

    imshow("original image", img);
    imshow("erosion image", erosion_img);
    imshow("dilate image", dilate_img);


    Mat open_mat, close_mat, gradient_mat, tophat_mat, blackhat_mat;
    morphologyEx(img, open_mat, MORPH_OPEN, kern);
    morphologyEx(img, close_mat, MORPH_CLOSE, kern);
    morphologyEx(img, gradient_mat, MORPH_GRADIENT, kern);
    morphologyEx(img, tophat_mat, MORPH_TOPHAT, kern);
    morphologyEx(img, blackhat_mat, MORPH_BLACKHAT, kern);

    imshow("Opening", open_mat);
    imshow("Closing", close_mat);
    imshow("Grandient", gradient_mat);
    imshow("Tohat", tophat_mat);
    imshow("Black", blackhat_mat);

    cvWaitKey(0);
    return 0;
}

参考:

https://www.cnblogs.com/korbin/p/5625340.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值