0030-用OpenCV的inpaint函数做图像的污点修复

OpenCV提供了inpaint函数做图像的污点修复,它是基于像素邻域计算进行的修复,原型如下
C++: void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)
参数意义如下
src:需要进行修复的图像
inpaintMask:掩码图像,和src一样大小,非0像素点表示为需要修复的点
dst:输出图像
inpaintRadius:算法使用的邻域大小
flags:算法选择,有两个值,当值为INPAINT_NS时,代表使用的是Navier-Stokes提出的修复算法;当值为INPAINT_TELEA时,代表使用的是lexandru Telea提出的修复算法。示例代码如下:
代码中用到的图像下载链接:http://pan.baidu.com/s/1i47cbVR 密码:rqat

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include 
#include     
#include 
#include 
#include 

#include 
#include 

#include 

using namespace cv;
using namespace std;

bool g_bDrawing = false;
Point g_CurrPoint, g_OrgPoint;
int g_nThick = 5, g_nBlue = 255, g_nGreen = 255, g_nRed = 0;
int g_nImageOneValue = 49;
Mat srcImage;
Mat grayImage;
Mat maskImage;

void onMouse(int event, int x, int y, int flag, void *param)
{
    //onMouse函数的完整代码请搜索公众号"qxsf321",关注后回复0030获取
    //onMouse函数的完整代码请搜索公众号"qxsf321",关注后回复0030获取
    //onMouse函数的完整代码请搜索公众号"qxsf321",关注后回复0030获取
}

int main()
{

        srcImage = imread("a_zhu.jpg");

        //用一个变量来存储原图像  
        Mat g_srcImage;
        srcImage.copyTo(g_srcImage);

        //为掩膜图分配空间  
        maskImage.create(srcImage.size(), CV_8UC1);
        maskImage = Scalar::all(0);

        namedWindow("【鼠标事件窗口】");
        setMouseCallback("【鼠标事件窗口】", onMouse, 0);

        namedWindow("【线条颜色设置窗口】", 0);
        createTrackbar("thick", "【线条颜色设置窗口】", &g_nThick, 100, 0);
        createTrackbar("Blue", "【线条颜色设置窗口】", &g_nBlue, 255, 0);
        createTrackbar("Green", "【线条颜色设置窗口】", &g_nGreen, 255, 0);
        createTrackbar("Red", "【线条颜色设置窗口】", &g_nRed, 255, 0);

        char key;
        while (1)
        {
                imshow("【鼠标事件窗口】", srcImage);
                key = waitKey();
                if (key == 27)
                        break;

                //如果检测到键值是1 则恢复为原图  
                if (key == '1')
                {
                        g_srcImage.copyTo(srcImage);
                        maskImage = Scalar::all(0);
                        imshow("【鼠标事件窗口】", srcImage);
                }

                //如果检测到空格 则开始执行图像修复  
                Mat dstImage;
                dstImage.create(srcImage.size(), srcImage.type());
                if (key == ' ')
                {
                        inpaint(srcImage, maskImage, dstImage, 3, INPAINT_TELEA);
                        imshow("【修补后的图像】", dstImage);
                }
        }

        return 0;
}


运行结果截图如下

0030-用OpenCV的inpaint函数做图像的污点修复_第1张图片
 

你可能感兴趣的:(OpenCV下的图像平滑技术)