読者です 読者をやめる 読者になる 読者になる

SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

OpenCvSharpを使って、画像中の不要オブジェクトの除去をしてみる

OpenCVのInpaintメソッドを使って、画像内の不要なオブジェクトの除去をしてみました。

OpenCVの↓のメソッドをOpenCVC#向けラッパーライブラリ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

入力画像
元画像 マスク画像
f:id:minami_SC:20150930002019j:plain:w300 f:id:minami_SC:20150930002028p:plain:w300
結果画像

f:id:minami_SC:20150930002350j:plain

微妙に元の文字が見えますが、パッと見は気づかない程度にはうまいこと補間できたかな。

サンプル2

入力画像
元画像 マスク画像
f:id:minami_SC:20150930002422j:plain:w300 f:id:minami_SC:20150930002436p:plain:w300
結果画像

f:id:minami_SC:20150930002444j:plain

コレはなかなかキレイに消えました!!
適当に試しただけですが、割とキレイに指定領域の除去と、その部分の補間ができていると思います。