如何在opencv中使用erode和dilate功能?

时间:2013-06-26 20:33:19

标签: c++ image opencv

我试图通过侵蚀和扩张过程消除数字周围的事物。我试过但没有发生任何事。我改变了值只是为了看看是否会改变一些东西,但是再一次,没有任何改变。图像继续如上面的链接。这个参数怎么样......我阅读了文档,但不太明白(正如你所看到的,我在猜测函数)。我做错了什么?

图片:https://docs.google.com/file/d/0BzUNc6BOkYrNeVhYUk1oQjFSQTQ/edit?usp=sharing

代码:

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

using namespace cv;

int main ( int argc, char **argv )
{
    Mat im_gray;
    Mat img_bw;
    Mat img_final;

    Mat im_rgb  = imread("cam.jpg");
    cvtColor(im_rgb,im_gray,CV_RGB2GRAY);


    adaptiveThreshold(im_gray, img_bw, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY_INV, 105, 1); 


    dilate(img_bw, img_final, 0, Point(-1, -1), 2, 1, 1);


    imwrite("cam_final.jpg", img_final);

    return 0;
}  

2 个答案:

答案 0 :(得分:17)

根据official docs,第三个参数应该是内核(或结构元素)。您目前正在通过0:

dilate(img_bw, img_final, 0, Point(-1, -1), 2, 1, 1);

尝试以这种方式重写:

dilate(img_bw, img_final, Mat(), Point(-1, -1), 2, 1, 1);

在这种情况下,将使用默认的3x3内核。

答案 1 :(得分:1)

内核基本上是一个矩阵。它在输入矩阵(图像)上相乘或重叠,以产生所需的输出修改(在这种情况下是扩张的)矩阵(图像)。

尝试更改Mat()的参数 dilate(img_bw, img_final, Mat(), Point(-1, -1), 2, 1, 1); 你基本上改变了内核的像素数(高度和宽度),这将改变原始图片的扩张效果。

因此,在dilate的参数中,您使用的是Mat(),而不是esenti已经说过的数字。