OpenCV を用いた Image Inpainting プログラム例
【概要】
OpenCV を用いて、Image Inpainting(画像修復)を行う。Image Inpainting とは、画像中の指定領域を周囲の画素情報から自動的に補完・修復する技術である。不要物の除去や欠損部分の復元などに使用される。
【目次】
【関連する外部ページ】
- OpenCV の公式ページ: https://opencv.org
- GitHub の OpenCV のページ: https://github.com/opencv/opencv/releases
【サイト内の関連情報】
- OpenCV について [PDF] , [パワーポイント]
- OpenCV のインストール,画像表示を行う C++ プログラムの実行手順: 別ページ »で説明
- OpenCVとPythonを活用した画像・ビデオ処理プログラム: 別ページ »にまとめ
- OpenCV 4 の C/C++ プログラム: 別ページ »にまとめている.
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 の機能
- imread: 画像ファイルの読み込み
- Mat::zeros: 画素値0の画像を作りたいとき
- rectangle: 長方形(塗りつぶし機能あり)
- inpaint: Image Inpainting の実行。INPAINT_NS(Navier-Stokes法)とINPAINT_TELEA(Telea法)の2種類のアルゴリズムが選択可能
- namedWindow: ウインドウを開く
- imshow: ウインドウに画像を表示
◆ Linux でのビルド手順例
g++ -o a.out hoge.cpp -std=c++17 `pkg-config --cflags --libs opencv5`
◆ 実行結果の例
./a.out