1. 程式人生 > >S2.1 修復影象小程式(簡單版)

S2.1 修復影象小程式(簡單版)

用OpenCV自帶的inpaint()演示

CV_EXPORTS_W void inpaint( 
    InputArray src, 
    InputArray inpaintMask,
    OutputArray dst, 
    double inpaintRadius, 
    int flags 
);
  • src 輸入影象
  • inpaintMask 掩膜,和輸入矩陣相同size的黑白矩陣。白色表示感興趣區域。這裡指需要修復的區域。
  • dst 輸出影象
  • inpaintRadius 是渲染半徑,一般用小半徑3,大半徑容易模糊。
  • flags 修復方法,有兩種:INPAINT_NS 和 INPAINT_TELEA。
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
    Mat src = imread("images/favorite/cat.jpg");
    Mat dst;

    Rect rect0(624, 655, 400, 20);//這裡的引數是我手動修改湊出來的

    Mat mask = Mat::zeros(src.size(), CV_8UC1);
    mask(rect0).setTo(255);

    inpaint(src, mask, dst, 3, INPAINT_NS)
; imshow("mask", mask); imshow("src", src); imshow("dst", dst); waitKey(0); return 0; }

畫圖程式

建立滑鼠回撥函式

CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
#include <opencv2/opencv.hpp>

using namespace cv;

Mat mask_board;
int width = 5; int paint_or_wipe = 1; void draw_dot(int event, int x, int y, int flags, void *ustc) { Scalar color; if(paint_or_wipe) color = (255); else color = (0); if(event == EVENT_LBUTTONDOWN) rectangle(mask_board, Point(x-width/2, y-width/2), Point(x+width/2, y+width/2), color, -1); if(event == EVENT_MOUSEMOVE and flags == EVENT_FLAG_LBUTTON) rectangle(mask_board, Point(x-width/2, y-width/2), Point(x+width/2, y+width/2), color, -1); } int main() { Mat src = imread("images/favorite/cat.jpg"); mask_board = Mat::zeros(src.size(), CV_8UC1); imshow("mask_board", mask_board); setMouseCallback("mask_board", draw_dot); int k = 1; createTrackbar("paint_or_wipe", "mask_board", &k, 1); while (1) { paint_or_wipe = k; imshow("mask_board", mask_board); if(waitKey(1) == 'q') break; } return 0; }

做一個去除水印小工具

利用OpenCV自帶的highgui來做一個小應用,支援用滑鼠劃出水印位置,然後除水印。

#include <opencv2/opencv.hpp>

using namespace cv;

Mat mask_board;
const int width = 7;
int paint_or_wipe = 1;
int show = 1;

void draw_dot(int event, int x, int y, int flags, void *ustc)
{
    Scalar color;
    if(paint_or_wipe)
        color = (255);
    else
        color = (0);
    if(event == EVENT_LBUTTONDOWN or (event == EVENT_MOUSEMOVE and flags == EVENT_FLAG_LBUTTON))
        rectangle(mask_board, Point(x - width / 2, y - width / 2), Point(x + width / 2, y + width / 2), color, -1);

}

int main()
{
    Mat src = imread("images/favorite/my.jpg");
    Mat dst;
    mask_board = Mat(src.size(), CV_8UC1, Scalar(0));

    imshow("image", src);
    setMouseCallback("image", draw_dot);
    createTrackbar("paint_or_wipe", "image", &paint_or_wipe, 1);
    createTrackbar("show", "image", &show, 1);

    while (1)
    {
        if(waitKey(1) == 'q')
            break;

        inpaint(src, mask_board, dst, 3, INPAINT_NS);
        if(!show)
            bitwise_and(src, Scalar(0, 0, 0), dst, mask_board);

        imshow("image", dst);
    }

    waitKey(0);
    return 0;
}

在這裡插入圖片描述

(完)