【问题标题】:How to use erode and dilate function in opencv?如何在opencv中使用侵蚀和扩张功能?
【发布时间】:2013-06-24 04:11:01
【问题描述】:

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

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

【问题讨论】:

标签: c++ image opencv


【解决方案1】:

根据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 内核。

【讨论】:

  • @Anne 构造一个空的cv::Mat。根据文档,“如果 element=Mat() ,则使用 3 x 3 矩形结构元素。”
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-02-15
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多