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 <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输出显示。


效果演示

  原图像
                                          
  掩码图像
                                          
  结果图像
                                          
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值