1. 程式人生 > >0030-用OpenCV的inpaint函式做影象的汙點修復

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 <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>

#include <opencv2/photo/photo.hpp>
#include <opencv2/photo/photo_c.h>

#include <iostream>

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;
}


執行結果截圖如下