實現圖像修補、物體去除:inpaint 函數
void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags);
- src,輸入圖像,即源圖像,填 Mat 類對象即可。但需是 8 位單通道或三通道圖像。
- inpaintMask,修復掩膜,為 8 位單通道圖像。其中非零像素為需要修補的區域。
- dst,輸出圖像,需要和源圖像有相同的尺寸和類型。
- inpaintRadius,圓形鄰域半徑。
- flags,修補方法的標識符,兩種選擇:
標識符 | 說明 |
INPAINT_TELEA | 基於 Navier-Stokes 方程的方法 |
INPAINT_NS | Alexandru Telea 方法 |
代碼示例:
//該程序功能為:消除鼠標選擇的矩形區域內的物體
#include<opencv.hpp> #include<iostream>
using namespace std; using namespace cv; Mat src, back, dst; Point pre, now; bool draw = false; RNG rngs = { 12345 }; Scalar colors; void on_mouse(int event, int x, int y, int flags, void *param) {//鼠標操作響應函數
switch (event){ case EVENT_LBUTTONDOWN://按下左鍵
draw = true; pre = Point(x, y); break; case EVENT_MOUSEMOVE://鼠標移動
if (draw) { Mat tem = dst.clone(); now = Point(x, y); colors = Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255)); rectangle(tem, pre, now, colors); imshow("dst", tem); } break; case EVENT_LBUTTONUP://左鍵抬起
draw = false; rectangle(back, pre, now, Scalar(255), -1);//在 修復掩膜 圖像中繪制選擇區域
inpaint(dst, back, dst, 3, INPAINT_TELEA);//修復圖像
imshow("dst", dst); break; } } int main() { src = imread("C:/Users/齊明洋/Desktop/示例圖片/1.jpg"); imshow("src", src); namedWindow("dst"); dst = src.clone(); imshow("dst", dst); back = Mat::zeros(src.size(), CV_8UC1);//修復掩膜
setMouseCallback("dst", on_mouse);//https://www.cnblogs.com/bjxqmy/p/11914601.html
waitKey(0); }
效果演示: