图像的修复是重建图像和视频受损部分的过程,这个过程也成为图像或视频的插值。
OpenCV 2.4版本支持一种修复算法,函数的模型为:
void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)
Parameters:
src : 输入的图像 8-bit 1通道或3通道
inpaintMask : 图像的掩码, 8-bit 1-channel image.
dst : 输出图像
inpaintRadius: 表示有flags所制定的算法可以使用的邻域
flag : 有两种方式
1.INPAINT_NS: 该方法是基于Navier-Stokes方法
2.INPAINT_TELEA: 该方法是抑郁Alexandru Telea提出的算法
如果不知道图像的掩码,则去获得它的掩码挺复杂的,应该你并不知道,什么情况下才是最优的,只能去实验。
更具阈值去获得图像掩码:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
其中thresh为所要设置的阈值
maxval为
type 以什么形式设置阈值。
type的方式如下图所示:
这里选用的是二值的方式,即当src(x,y)>thresh时,将其设为maxval.
一个实例:这个例子中获得的不是很好的掩码,掩码的选择可能更为的复杂。
#include "opencv2/opencv.hpp"
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
// Read the source file
Mat src;
src = imread("3.jpg");
// Create the mask
Mat mask;
cvtColor(src, mask, COLOR_RGB2GRAY); //将其转换成灰度图像,因为掩码必须是一维的
/*for (int i = 0; i < mask.rows; i++) {
for (int j = 0; j < mask.cols; j++)
cout << int(mask.at(i, j)) << setw(4);
cout << endl;
}*/
cout << int(mask.at(mask.rows/2, mask.cols/2))<190, 255, THRESH_BINARY);
// Apply the inpainting algorithms
Mat dst, dst2;
inpaint(src, mask, dst, 10, INPAINT_TELEA);
inpaint(src, mask, dst2, 10, INPAINT_NS);
// Show the results
namedWindow(" ORIGINAL ", WINDOW_AUTOSIZE);
imshow(" ORIGINAL ", src);
namedWindow(" MASK ", WINDOW_AUTOSIZE);
imshow(" MASK ", mask);
namedWindow(" INPAINT_TELEA ", WINDOW_AUTOSIZE);
imshow(" INPAINT_TELEA ", dst);
namedWindow(" INPAINT_NS ", WINDOW_AUTOSIZE);
imshow(" INPAINT_NS ", dst2);
waitKey();
return 0;
}