OpenCV を用いた Image Inpainting プログラム例

概要

OpenCV を用いて、Image Inpainting(画像修復)を行う。Image Inpainting とは、画像中の指定領域を周囲の画素情報から自動的に補完・修復する技術である。不要物の除去や欠損部分の復元などに使用される。

目次

関連する外部ページ

サイト内の関連情報

Image Inpainting のC++プログラム例

◆プログラムの例

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/photo.hpp>

// このプログラムは inpaint(画像修復)のサンプルである

using namespace cv;

int main( int argc, char** argv )
{
  // 元画像を読み込む(3チャンネルのカラー画像)
  Mat rgb = imread( samples::findFile("fruits.jpg"), IMREAD_COLOR );

  // mask は黒背景に白い長方形を描いた画像とする
  Mat mask = Mat::zeros(rgb.size(), CV_8U);
  rectangle( mask, Point(40,40), Point(160,160), Scalar::all(255), FILLED, LINE_8, 0 );

  // inpaint(画像修復)を実行する
  Mat rgb2, rgb3;
  inpaint(rgb, mask, rgb2, /* inpaint の半径 */ 10.0, INPAINT_NS);
  inpaint(rgb, mask, rgb3, /* inpaint の半径 */ 10.0, INPAINT_TELEA);

  // マスク画像を表示する
  namedWindow( "mask", WINDOW_AUTOSIZE );
  imshow( "mask", mask );
  waitKey(0);

  // INPAINT_NS(Navier-Stokes法)の結果を表示する
  namedWindow( "INPAINT_NS", WINDOW_AUTOSIZE );
  imshow( "INPAINT_NS", rgb2 );
  waitKey(0);

  // INPAINT_TELEA(Telea法)の結果を表示する
  namedWindow( "INPAINT_TELEA", WINDOW_AUTOSIZE );
  imshow( "INPAINT_TELEA", rgb3 );
  waitKey(0);

  return 0;
}

◆プログラム中で使用している OpenCV の機能

◆ Linux でのビルド手順例

g++ -o a.out hoge.cpp -std=c++17 `pkg-config --cflags --libs opencv5`

◆ 実行結果の例

./a.out