旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【OpenCV】 穴を塗りつぶす

learnopencv.comのブログ(Filling holes in an image using OpenCV ( Python / C++ ) | Learn OpenCV)のメモになります。タイトルにあるように、OpenCVを使って穴を塗りつぶす方法についてブログに書かれており、MATLABにはimfillという関数があるけど、OpenCVには無いからどうする?という問いかけがされています。

f:id:ni4muraano:20170329234450j:plain:w150 ⇒ f:id:ni4muraano:20170329234507j:plain:w150

// Step1:画像の読み込み
Mat image = imread("nickel.jpg", IMREAD_GRAYSCALE);

// Step2:二値化処理を行う(二値化処理が上手くいかなかったため、ソース元と少し閾値を変更した)
Mat binary_image;
threshold(image, binary_image, 200, 255, THRESH_BINARY_INV);

// Step3:コインの外側の色を反転させる
Mat floodfilled_image = binary_image.clone();
floodFill(floodfilled_image, cv::Point(0, 0), Scalar(255));

// Step4:全体を反転させる
Mat inverted_floodfilled_image;
bitwise_not(floodfilled_image, inverted_floodfilled_image);

// Step5:コインの中を塗りつぶす
Mat foreground = (binary_image | inverted_floodfilled_image);

floodFillというメソッドがOpenCVにはあることも勉強になったので、覚えておきたいと思います。最後にソースコード中のステップ1からステップ5までの画像を並べます。

f:id:ni4muraano:20170329234450j:plain:w100 ⇒ f:id:ni4muraano:20170329235330j:plain:w100 ⇒ f:id:ni4muraano:20170329235340j:plain:w100 ⇒ f:id:ni4muraano:20170329235351j:plain:w100 ⇒ f:id:ni4muraano:20170329234507j:plain:w100