gfxenon

导航

 

这几天继续看OpenCV的自带教程。

今天的这个示例是形态学变换,腐蚀Erosion和膨胀Dialating。

自带教程讲的太过于简略,看了另外一本计算机图形学教材才理解他的确切定义以及一些典型用法。

说到他们的确切定义,涉及到集合的概念。简单来说就是用一个kernel集合去和输入图形的集合做集合并操作或者集合与操作。

从计算机图形学的书上来看,形态学操作应该主要用于二值化的图形。如果用于一般图形,得到的结果也有他的意义。

一个典型的例子是指纹的预处理,去除噪点和断点。

当然这不是一个简单的形态学处理方法,属于两种形态学操作的组合。

这个示例还包括了一些界面的操作,比如添加滑动条等。

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

#include <iostream>

using namespace std;
using namespace cv;

Mat src, erosion_dst, dialating_dst;

char *erosion_window = "Erosion";
char *dialating_window = "Dialating";

int erosion_element, erosion_size;
int dialating_element, dialating_size;
const int max_ele = 2;
const int max_size = 15;

void Erosion(int, void*);



void Dialating(int, void*);

int main(int argc, char** argv)
{
    src = imread(argv[1], IMREAD_COLOR);
    if (!src.data)
    {
        return -1;
    }
    namedWindow(erosion_window, WINDOW_AUTOSIZE);
    namedWindow(dialating_window, WINDOW_AUTOSIZE);
    createTrackbar("Erosion type", erosion_window, &erosion_element, max_ele, Erosion);
    createTrackbar("Erosion size", erosion_window, &erosion_size, max_size, Erosion);
    createTrackbar("Dialating type", dialating_window, &dialating_element, max_ele, Dialating);
    createTrackbar("Dialating size", dialating_window, &dialating_size, max_size, Dialating);
    imshow(erosion_window, src);
    imshow(dialating_window, src);
    waitKey(0);

    return 0;
}
void Erosion(int, void*)
{
    int erosion_type = 0;
    if (erosion_element == 0)
    {
        erosion_type = MORPH_CROSS;
    }
    if (erosion_element == 1)
    {
        erosion_type = MORPH_ELLIPSE;
    }
    if (erosion_element == 2)
    {
        erosion_type = MORPH_RECT;
    }
    Mat kernel = getStructuringElement(erosion_type, Size(erosion_size * 2 + 1, erosion_size * 2 + 1), Point(erosion_size, erosion_size));
    erode(src, erosion_dst, kernel);
    imshow(erosion_window, erosion_dst);
}

void Dialating(int, void*)
{
    int dialating_type = 0;
    if (dialating_element == 0)
    {
        dialating_type = MORPH_CROSS;
    }
    if (dialating_element == 1)
    {
        dialating_type = MORPH_ELLIPSE;
    }
    if (dialating_element == 2)
    {
        dialating_type = MORPH_RECT;
    }
    Mat kernel;
    kernel = getStructuringElement(dialating_type, Size(2 * dialating_size + 1, 2 * dialating_size + 1), Point(dialating_size, dialating_size));
    dilate(src, dialating_dst, kernel);
    imshow(dialating_window, dialating_dst);
    
}

 

posted on 2017-12-10 21:19  gfxenon  阅读(128)  评论(0)    收藏  举报