日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

8.6 圖像修補

基本思想:
??利用已經被破壞區域的邊緣,即邊緣的顏色和結構,繁殖和混合到損壞的圖像中,達到圖像修補的目的。

8.6.1 實現圖像修補:inpaint()函數

1.作用:
??用來從掃描的照片中清除灰塵和劃痕,從靜態圖像或視頻中去除不需要的物體
2.函數原型:

void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)

3.參數說明:
(1)輸入圖像,8位單通道或三通道
(2)修復掩模,8位單通道,其中的非零像素表示需要修補區域
(3)修補后圖像
(4)需要修補的每個點的圓形區域,為修復算法的參考半徑
(5)修補方法的標識符,可取值:
??1)INPAINT_NS:基于Navier-Stokes方程的方法
??2)INPAINT_TELEA:Alexandru Telea方法

8.6.2 綜合示例

/*程序說明:鼠標繪制白色線條破壞原圖像圖像鍵盤按鍵【1】啟動進行圖像修復按鍵【2】恢復原始圖像
*/#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//定義輔助宏
#define WINDOW_NAME1 "【原始圖窗口】"
#define WINDOW_NAME2 "【修復效果圖】"
//全局變量
Mat g_srcImage, g_inpaintMask;
Point previousPoint(-1, -1); //原來的點坐標
//全局函數
static void on_Mouse(int event, int x, int y, int flags, void*);
static void ShowHelpText();int main()
{//顯示幫助文字ShowHelpText();//載入原圖并顯示Mat srcImage = imread("Night.jpg");if (!srcImage.data){printf("載入原圖失敗~!\n");return false;}imshow(WINDOW_NAME1, srcImage);//初始化掩模g_srcImage = srcImage.clone();g_inpaintMask = Mat::zeros(g_srcImage.size(), CV_8U);//設置鼠標回調消息setMouseCallback(WINDOW_NAME1, on_Mouse, 0);//按鍵輪詢while (1){//獲取按鍵鍵值char c = (char)waitKey();//鍵值為ESC,程序退出if (c == 27) break;//鍵值為2,恢復原始圖像if (c == '2'){g_inpaintMask = Scalar::all(0);srcImage.copyTo(g_srcImage);imshow(WINDOW_NAME1, g_srcImage);}//鍵值為1,進行圖像修復if (c == '1'){Mat inpaintedImage;inpaint(g_srcImage, g_inpaintMask, inpaintedImage, 3, INPAINT_TELEA);imshow(WINDOW_NAME2, inpaintedImage);}}return 0;
}
//鼠標回調函數
static void on_Mouse(int event, int x, int y, int flags, void*)
{//鼠標左鍵彈起消息if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON)){previousPoint = Point(-1, -1);}//鼠標左鍵按下消息else if (event == EVENT_LBUTTONDOWN){previousPoint = Point(x, y);}//鼠標按下狀態并移動,進行繪制else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)){Point pt(x, y);if (previousPoint.x < 0){previousPoint = pt;}line(g_inpaintMask, previousPoint, pt, Scalar::all(255), 5, 8, 0);line(g_srcImage, previousPoint, pt, Scalar::all(255), 5, 8, 0);previousPoint = pt;imshow(WINDOW_NAME1, g_srcImage);}
}
static void ShowHelpText()
{printf("\n\t歡迎來到【圖像修復】示例程序~\n");printf("\n\t請再進行圖像修復操作之前,在【原始圖】窗口中進行適量的繪制\n");printf("\n\t按鍵操作說明:\n");printf("\t\t\t鍵盤按鍵【1】--進行圖像修復\n");printf("\t\t\t鍵盤按鍵【2】--恢復原始圖\n");printf("\t\t\t鍵盤按鍵【ESC】--退出程序\n");
}

運行效果:


總結

以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。