OpenCvSharpを使って、画像中の不要オブジェクトの除去をしてみる
OpenCVのInpaintメソッドを使って、画像内の不要なオブジェクトの除去をしてみました。
OpenCVの↓のメソッドをOpenCVのC#向けラッパーライブラリOpenCvSharpを利用して呼び出してみます。
http://opencv.jp/opencv-2svn/cpp/miscellaneous_image_transformations.html#cv-inpaint
とりあえず、ちゃっちゃとコードと結果だけメモ。
準備
適当にコンソールアプリのプロジェクトを作り、NugetからOpenCvSharpをインストールします。
PMコンソールからインストールする場合は、以下のコマンドで。
Install-Package OpenCvSharp-AnyCPU
使ってみた
IplImageの画像を用意して、Cv.Inpaintメソッドを呼ぶだけで、お手軽に利用できます。
このメソッドでは、第一引数に元画像、第二引数に不要な領域を指定するためのマスク画像を指定し、第三引数の変数に結果画像を格納します。
ということで、第一引数用のimg変数は普通に画像を読み込み、マスク用のmask変数はグレイスケールを指定して読み込みます。 結果格納用のdstは、imgと同じサイズを指定し3チャンネルで各チャネル8ビットの画像オブジェクトを用意します。
program.cs
class Program { static void Main(string[] args) { using (var img = new IplImage(@"Images/1.jpg")) using(var mask = new IplImage(@"Images/1_mask.png", LoadMode.GrayScale)) using (var dst = new IplImage(img.Size, BitDepth.U8, 3)) { // Inpaintメソッドで不要領域の除去をする Cv.Inpaint(img, mask, dst, 10.0, InpaintMethod.NS); // 結果をウィンドウで表示 CvWindow.ShowImages(dst); } } }
サンプル1
入力画像
元画像 | マスク画像 |
---|---|
結果画像
微妙に元の文字が見えますが、パッと見は気づかない程度にはうまいこと補間できたかな。
サンプル2
入力画像
元画像 | マスク画像 |
---|---|
結果画像
コレはなかなかキレイに消えました!!
適当に試しただけですが、割とキレイに指定領域の除去と、その部分の補間ができていると思います。