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