opencv进行图像复原

简介

  本篇是讲用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                                                                                                      
#include 
#include 
#include 
#include 
#include 
#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输出显示。


效果演示

  原图像
                                          
  掩码图像
                                          
  结果图像
                                          

你可能感兴趣的:(opencv,图形图像)