Opencv学习笔记(七)--图像修复

图像修复

图像的修复是重建图像和视频受损部分的过程,这个过程也成为图像或视频的插值。

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的方式如下图所示:

Opencv学习笔记(七)--图像修复_第1张图片

这里选用的是二值的方式,即当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;
}

Opencv学习笔记(七)--图像修复_第2张图片

你可能感兴趣的:(CV)