简介
本篇是讲用opencv函数:inpaint来进行图像复原。
前提准备
inpaint函数
void cvInpaint(const CvArr* src, const CvArr* inpaint_mask, CvArr* dst, double inpaintRange, int flags)
src: 需要处理的原图像。
inpaint_mask:图像掩码。(简单的说,就是表示src中需要被修复的图像位置)
dst: 处理后生产的复原图片。
inpaintRange:修复算法取临近值的半径。
flags: 选择Inpainting使用的复原算法:INPAINT_NS 或者 INPAINT_TELEA
实例代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
#include <string.h>
#include <opencv/cv.h>
#include <stdio.h>
#include "opencv2/photo/photo.hpp"
using namespace cv;
int pic_info[4];
char pic_name[20];
Mat mat1, imageROI, dst;
int width, height;
IplImage src, roi, dstI;
void on_mouse( int event, int x, int y, int flags, void* ustc){
if(event == CV_EVENT_LBUTTONDOWN){
pic_info[0] = x; /*width1*/
pic_info[1] = y; /*height1*/
pic_info[2] = 0; /*width2*/
pic_info[3] = 0; /*height2*/
}
if(flags == CV_EVENT_FLAG_LBUTTON){
pic_info[2] = x;
pic_info[3] = y;
cvZero(&roi);
cvZero(&dstI);
rectangle(imageROI, cvPoint(pic_info[0], pic_info[1]),cvPoint(pic_info[2], pic_info[3]),cvScalar(255,255,255), -1);
inpaint(mat1, imageROI, dst, 1, CV_INPAINT_TELEA);
imshow("2", imageROI);
imshow("3", dst);
}
}
int main(int agrc, char *argv[]){
memcpy(pic_name,argv[1], sizeof(argv[1]));
mat1 = cv::imread(argv[1]);
src = mat1;
width = mat1.rows;
height = mat1.cols;
imageROI = cv::Mat(width, height,CV_8UC1,cv::Scalar(0, 0, 0));
dst = cv::Mat(width, height,CV_8UC3,cv::Scalar(0, 0, 0));
roi = imageROI;
dstI = dst;
imshow("1", mat1);
cvSetMouseCallback("1", on_mouse, NULL);
cv::waitKey(0);
return 0;
}
代码中src为原图像,roi为图像掩码,dstI为结果图像。
也是利用鼠标的拖拽,在和src同样大小的ROI中生成白色矩形。该矩形在inpaint函数中就表示需要被修复的位置和大小,最后将修复后的结果图像dstI输出显示。
效果演示
原图像
掩码图像
结果图像