简介
本篇是讲用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输出显示。
效果演示
原图像
掩码图像
结果图像
时间: 2024-11-02 14:14:04