2013-06-26 33 views
9

我試圖消除與侵蝕和擴張過程中的數字周圍的東西。我嘗試過但沒有發生任何事情。我只是爲了看看是否會改變某些東西而改變了這些值,但再一次沒有任何改變。圖像像上面的鏈接一樣繼續。這個參數怎麼樣?我讀了文檔,但不太明白(正如你所看到的,我在函數中猜測)。我究竟做錯了什麼?如何在opencv中使用erode和dilate函數?

圖像: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

因此,讓我們從文檔http://docs.opencv.org/modules/imgproc/doc/filtering.html#void%20dilate%28InputArray%20src,%20OutputArray%20dst,%20InputArray%20kernel,%20Point %20anchor,%20int%20iterations,%20int%20borderType,%20const%20Scalar&%20borderValue%29給我一點時間... – Antonio

回答

13

根據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); 

在這種情況下,默認的3×3的內核將被使用。

+1

它的工作原理,謝謝! :D但是爲什麼?這個「Mat()」是做什麼的? – U23r

+4

@Anne構造一個空的'cv :: Mat'。根據文檔,「if'element = Mat()',使用3 x 3矩形結構元素。」 – Aurelius

1

內核基本上是一個矩陣。這在輸入矩陣(圖像)上相乘或重疊以產生修改的(在這種情況下擴大的)矩陣(圖像)的期望輸出。

嘗試改變 dilate(img_bw, img_final, Mat(), Point(-1, -1), 2, 1, 1);Mat()參數你基本上改變像素(高度和寬度)內核的數量,這將改變原來的PIC的擴張效應。

所以在dilate的參數中,您可以使用Mat()而不是esenti已經指出的數字。