web-dev-qa-db-ja.com

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;
}  
9
U23r

公式ドキュメント によると、3番目の引数はカーネル(または構造化要素)でなければなりません。現在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カーネルが使用されます。

17
Esenti

カーネルは基本的に行列です。これは、入力マトリックス(画像)で乗算またはオーバーラップされ、変更された(この場合は拡張された)マトリックス(画像)の目的の出力を生成します。

Mat()dilate(img_bw, img_final, Mat(), Point(-1, -1), 2, 1, 1);のパラメータを変更してみてください。基本的にはカーネルのピクセル数(高さと幅)を変更しているため、元の画像の膨張効果が変化します。

したがって、dilateのパラメーターでは、esentiですでに述べられている数値の代わりにMat()を使用します。

1
Tarun