OpenCV学习 day5 形态学操作

图像的形态学操作——基于形状的一系列的图像处理操作合集

形态学的四个基本操作:膨胀、腐蚀、开、闭

值得注意的是:腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分

 

1. 膨胀dilate

A-原图

B-核

B覆盖下的A中最大像素值代替锚点像素,像素值整体变大

 

结构型元素(核)定义:

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

shape-可以是矩形,也可以是椭圆等  通过MORPH_*查看

ksize-是结构型元素大小

anchor-默认是(-1,-1)中心

 

如下图所示的结构元素是菱形(1构成的菱形区域)

 

 

 

膨胀操作:

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

kernel-就是定义的结构型元素

iterations-迭代运行几次

 

2. 腐蚀erode

B覆盖下的A中最小像素值代替锚点像素,像素值整体变小

 

 

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

 

demo:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat src, d_dst, r_dst, dst, bt_dst;
char OUTPUT[] = "dilate image";
int element_size = 3;
int max_size = 15;
void CallBack_Demo(int, void*);

int main(int argc, char** argv) {
    
    src = imread("D:/learning/image/5.jpg", WINDOW_AUTOSIZE);
    if (src.empty()) {
        printf("can not found image...\n");
        return -1;
    }

    namedWindow(OUTPUT);
    //设置拖动滑块控制size大小
    createTrackbar("Element size:", OUTPUT, &element_size, max_size, CallBack_Demo);
    CallBack_Demo(0, 0);

    waitKey(0);
    return 0;
}

//
void CallBack_Demo(int, void*) {
    int s = element_size * 2 + 1;
    //定义结构型元素
    Mat structure_element = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
    //dilate(src, dst, structure_element, Point(-1, -1), 1); //膨胀
    erode(src, dst, structure_element, Point(-1, -1), 1);  //腐蚀
    imshow(OUTPUT, dst);
    return;
}

其中createTrackbar函数创建一个滑块,用来控制膨胀腐蚀操作中的参数,效果如下图所示:

 

 

形态学操作

开 闭 形态学梯度 顶帽 黑帽

主要针对二值图像

 

morphologyEx函数

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() )

 int op- 形态学操作类型

 

3. 开open

先腐蚀后膨胀

 背景为黑  可以去掉小的前景

 

4. 闭close

 先膨胀后腐蚀

 可以填充前景中小的黑洞

 

开闭操作通过morphologyEx函数实现:

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() );

op-是操作的指令  前缀为MORPH_*

kernel-通过getStructuringElement指定,size越大,处理的范围越大

 

开:

Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));
morphologyEx(src, dst, MORPH_OPEN, kernel, Point(-1, -1));
imshow("input image", src);
imshow("output image", dst);

 

 

 

 闭:

Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));
morphologyEx(src, dst, MORPH_CLOSE, kernel, Point(-1, -1));
imshow("input image", src);
imshow("output image", dst);

 

 

 

 

 

 

 

4.形态学梯度 morphological gradient

又称基本梯度

膨胀减去腐蚀

op为MORPH_GRADIENT

 

 

 

5. 顶帽 top hat

原图像与开操作的差值

去掉大的前景

OP为MORPH_TOPHAT

 

 

 

 6. 黑帽 black hat

闭操作图像与原图的差值

 

op为MORPH_TOPHAT

 

应用

posted @ 2019-12-17 19:02  xyfun72  阅读(226)  评论(0编辑  收藏  举报