OpenCV を用いた Image Inpainting プログラム例
OpenCV を用いて、Image Inpainting(画像修復)を行う。Image Inpainting とは、画像中の指定領域を周囲の画素情報から自動的に補完・修復する技術である。不要物の除去や欠損部分の復元などに使用される。
【サイト内の OpenCV 関連ページ】
- OpenCV について [PDF] , [パワーポイント]
- OpenCV のインストール,画像表示を行う C++ プログラムの実行手順: 別ページ »で説明
- OpenCVとPythonを活用した画像・ビデオ処理プログラム: 別ページ »にまとめ
- OpenCV 4 の C/C++ プログラム: 別ページ »にまとめている.
【OpenCV の公式情報】
- OpenCV の公式ページ: https://opencv.org
- GitHub の OpenCV のページ: https://github.com/opencv/opencv/releases
◆プログラムの例
#include<cv.h>
#include<highgui.h>
#include<photo/photo.hpp>
// This program is 'inpaint' sample
using namespace cv;
int main( int argc, char** argv )
{
Mat rgb, mask, rgb2, rgb3;
// read original image
rgb = imread( "/usr/local/share/opencv/samples/c/fruits.jpg", /* 3-channel color image */ 1 );
// mask is white rectangle on a black background
mask = Mat::zeros(rgb.size(), CV_8U);
rectangle( mask, Point(40,40), Point(160,160), Scalar::all(255), CV_FILLED, 8, 0 );
// do inpaint
inpaint(rgb, mask, rgb2, /* inpaint radius */ 10.0, /* INPAINT_NS or INPAINT_TELEA */ INPAINT_NS);
inpaint(rgb, mask, rgb3, /* inpaint radius */ 10.0, /* INPAINT_NS or INPAINT_TELEA */ INPAINT_TELEA);
// display
namedWindow( "mask", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO );
imshow( "mask", mask );
waitKey(0);
// display
namedWindow( "INPAINT_NS", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO );
imshow( "INPAINT_NS", rgb2 );
waitKey(0);
// display
namedWindow( "INPAINT_TELEA", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO );
imshow( "INPAINT_TELEA", rgb3 );
waitKey(0);
return 0;
}
◆プログラム中で使用している OpenCV の機能
- imread: 画像ファイルの読み込み
- Mat::zeros: 画素値0の画像を作りたいとき
- rectangle: 長方形(塗りつぶし機能あり)
- inpaint: Image Inpainting の実行。INPAINT_NS(Navier-Stokes法)と INPAINT_TELEA(Telea法)の2種類のアルゴリズムが選択可能
- namedWindow: ウインドウを開く
- imshow: ウインドウに画像を表示
◆ Linux でのビルド手順例
g++ -o a.out hoge.cc -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lopencv_photo -lopencv_highgui -lopencv_core
◆ 実行結果の例 (OpenCV バージョン 2.4.1 で実行)
./a.out