2013-06-26 85 views
9

Tôi đang cố gắng loại bỏ những thứ xung quanh con số với quá trình xói mòn và giãn nở. Tôi đã thử nhưng không có gì xảy ra cả. Tôi đã thay đổi các giá trị chỉ để xem liệu có thay đổi gì đó không, nhưng một lần nữa, không có gì thay đổi. Hình ảnh tiếp tục như trong liên kết ở trên. Điều gì về các thông số này ... Tôi đọc tài liệu nhưng không hoàn toàn hiểu (như bạn có thể thấy, tôi đã đoán trong hàm). Tôi đang làm gì sai?Làm thế nào để sử dụng chức năng xói mòn và giãn nở trong opencv?

hình ảnh: https://docs.google.com/file/d/0BzUNc6BOkYrNeVhYUk1oQjFSQTQ/edit?usp=sharing

mã:

#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

Vì vậy, hãy bắt đầu từ tài liệu 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 cho tôi một chút ... – Antonio

Trả lời

13

Theo official docs, đối số thứ ba sẽ có các hạt nhân (hoặc yếu tố cơ cấu). Bạn đang đi qua 0:

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

Hãy thử viết lại nó theo cách này:

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

Trong trường hợp này, một hạt nhân 3x3 mặc định sẽ được sử dụng.

+1

Nó hoạt động, cảm ơn! : D Nhưng tại sao? Điều này "Mat()" làm gì? – U23r

+4

@Anne Điều đó tạo ra một 'cv :: Mat' trống. Theo các tài liệu, "nếu' phần tử = Mat() ', một phần tử cấu trúc hình chữ nhật 3 x 3 được sử dụng." – Aurelius

1

Hạt nhân về cơ bản là ma trận. Điều này được nhân lên hoặc chồng chéo lên ma trận đầu vào (hình ảnh) để tạo ra ma trận đầu ra mong muốn được sửa đổi (trong trường hợp này được giãn nở) (hình ảnh).

Hãy thử thay đổi các thông số của Mat() trong dilate(img_bw, img_final, Mat(), Point(-1, -1), 2, 1, 1); bạn về cơ bản thay đổi số lượng điểm ảnh (chiều cao và chiều rộng) của hạt nhân, mà sẽ làm thay đổi tác dụng giãn nở trên pic gốc.

Vì vậy, trong các thông số của dilate bạn sử dụng Mat() thay vì một số như đã được quy định bởi esenti.

Các vấn đề liên quan