OpenCV学习2-----使用inpaint函数进行图像修复
安裝opencv時(shí),在opencv的安裝路徑下,
sourcessamplescpp 路徑里面提供了好多經(jīng)典的例子,很值得學(xué)習(xí)。
這次的例子是利用inpaint函數(shù)進(jìn)行圖像修復(fù)。
CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask,
OutputArray dst, double inpaintRadius, int flags );
其中
InputArray src 表示要修復(fù)的圖像,
InputArray inpaintMask表示修復(fù)模板,
OutputArray dst 表示修復(fù)后的圖像,
double inpaintRadius 表示修復(fù)的半徑,
int flags 表示修復(fù)使用的算法 。 opencv提供了兩種選擇CV_INPAINT_TELEA 和 CV_INPAINT_NS。
感覺(jué)兩種算法修復(fù)效果都還不錯(cuò),但是都需要事先準(zhǔn)備修復(fù)模板mask,也就是inpaintMask 這個(gè)參數(shù)。
例子里面用鼠標(biāo)在圖片上劃線,劃線的同時(shí)也更新了mask,而真正應(yīng)用的時(shí)候需要事先設(shè)計(jì)好這個(gè)mask。
文末有最終效果圖。
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include <iostream>
using namespace cv;
using namespace std;
static void help()
{
cout << "
Cool inpainging demo. Inpainting repairs damage to images by floodfilling the damage
"
<< "with surrounding image areas.
"
"Using OpenCV version %s
" << CV_VERSION << "
"
"Usage:
"
"./inpaint [image_name -- Default fruits.jpg]
" << endl;
cout << "Hot keys:
"
" ESC - quit the program
"
" r - restore the original image
"
" i or SPACE - run inpainting algorithm
"
" (before running it, paint something on the image)
" << endl;
}
Mat img, inpaintMask;
Point prevPt(-1, -1);
static void onMouse(int event, int x, int y, int flags, void*)
{
if (event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON))
prevPt = Point(-1, -1);
else if (event == CV_EVENT_LBUTTONDOWN)
prevPt = Point(x, y);
else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
{
Point pt(x, y);
if (prevPt.x < 0)
prevPt = pt;
line(inpaintMask, prevPt, pt, Scalar::all(255), 5, 8, 0);//mask
line(img, prevPt, pt, Scalar::all(255), 5, 8, 0);
prevPt = pt;
imshow("image", img);
}
}
int main(int argc, char** argv)
{
char* filename = argc >= 2 ? argv[1] : (char*)"fruits.jpg";
Mat img0 = imread(filename, -1);
if (img0.empty())
{
cout << "Couldn't open the image " << filename << ". Usage: inpaint <image_name>
" << endl;
return 0;
}
help();
namedWindow("image", 1);
img = img0.clone();
inpaintMask = Mat::zeros(img.size(), CV_8U);//mask
imshow("image", img);
setMouseCallback("image", onMouse, 0);
for (;;)
{
char c = (char)waitKey();
if (c == 27)
break;
if (c == 'r')
{
inpaintMask = Scalar::all(0);
img0.copyTo(img);
imshow("image", img);
}
if (c == 'i' || c == ' ')
{
Mat inpainted;
//inpaint(img, inpaintMask, inpainted, 3, CV_INPAINT_TELEA);//CV_INPAINT_NS
inpaint(img, inpaintMask, inpainted, 3, CV_INPAINT_TELEA);
imshow("inpainted image", inpainted);
}
}
return 0;
}
圖1 原圖
圖2CV_INPAINT_NS 算法修復(fù)效果圖
圖3CV_INPAINT_TELEA算法修復(fù)效果圖
總結(jié)
以上是生活随笔為你收集整理的OpenCV学习2-----使用inpaint函数进行图像修复的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CAD单击另存为没有对话框该怎么办(周站
- 下一篇: python之csv模块(part1)-