10

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

图片: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;
}  
4

2 回答 2

19

根据官方文档,第三个参数应该是内核(或结构元素)。您当前正在传递 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 内核。

于 2013-06-26T20:45:07.957 回答
1

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

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

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

于 2014-01-07T18:05:57.543 回答