OpenCV学习笔记(十七):图像修补:inpaint()
生活随笔
收集整理的這篇文章主要介紹了
OpenCV学习笔记(十七):图像修补:inpaint()
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV學習筆記(十七):圖像修補:inpaint()
inpaint()函數
使用區域鄰域在圖像中還原選定區域。
void inpaint( InputArray src, // 表示要修復的圖像,8位三通道或三通道 InputArray inpaintMask, // 表示修復模板(掩模),8位單通道,非零區域為修補區域 OutputArray dst, // 表示修復后的圖像 double inpaintRadius, // 表示該算法所考慮的需要修補的每個點的圓形鄰域的圓形領域半徑。 int flags // 表示修復使用的算法 // CV_INPAINT_TELEA Alexandru Telea 算法 .// CV_INPAINT_NS 基于 Navier-Stokes 方程的算法 );感覺兩種算法修復效果都還不錯,但是都需要事先準備修復模板mask,也就是inpaintMask 這個參數。
例子里面用鼠標在圖片上劃線,劃線的同時也更新了mask,而真正應用的時候需要事先設計好這個mask。
示例:
#include <opencv2/opencv.hpp>using namespace cv; using namespace std;#define WINDOW_NAME0 "【原始圖參考】" //為窗口標題定義的宏 #define WINDOW_NAME1 "【原始圖】" //為窗口標題定義的宏 #define WINDOW_NAME2 "【修補后的效果圖】" //為窗口標題定義的宏 Mat srcImage0,srcImage1, inpaintMask; Point previousPoint(-1,-1);//原來的點坐標int main() {//輸出一些幫助信息printf("\n\n\n\t歡迎來到【圖像修復】示例程序~\n");printf( "\n\t請在進行圖像修復操作之前,在【原始圖】窗口中進行適量的繪制""\n\n\t按鍵操作說明: \n\n""\t\t【鼠標左鍵】-在圖像上繪制白色線條\n\n""\t\t鍵盤按鍵【ESC】- 退出程序\n\n""\t\t鍵盤按鍵【1】或【SPACE】-進行圖像修復操作 \n\n" );//1、載入原圖并顯示,初始化掩膜和灰度圖Mat srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/inpaint.jpg", 1);if(!srcImage.data ) { printf("讀取圖片錯誤,請確定目錄下是否有imread函數指定圖片存在~! \n"); return false; }srcImage0 = srcImage.clone();srcImage1 = srcImage.clone();inpaintMask = Mat::zeros(srcImage1.size(), CV_8U);//顯示原始圖參考imshow(WINDOW_NAME0, srcImage0);//顯示原始圖imshow(WINDOW_NAME1, srcImage1);//設置鼠標回調消息setMouseCallback( WINDOW_NAME1, On_Mouse, 0 );//輪詢按鍵,根據不同的按鍵進行處理while (1){//獲取按鍵鍵值char c = (char)waitKey();//鍵值為ESC,程序退出if( c == 27 )break;//鍵值為2,恢復成原始圖像if( c == '2' ){inpaintMask = Scalar::all(0);srcImage.copyTo(srcImage1);imshow(WINDOW_NAME1, srcImage1);}//鍵值為1或者空格,進行圖像修補操作if( c == '1' || c == ' ' ){Mat inpaintedImage;inpaint(srcImage1, inpaintMask, inpaintedImage, 3, CV_INPAINT_TELEA);imshow(WINDOW_NAME2, inpaintedImage);}}waitKey(0);return 0; } static void On_Mouse( int event, int x, int y, int flags, void* ) {//鼠標左鍵彈起消息if( event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON) )previousPoint = Point(-1,-1);//鼠標左鍵按下消息else if( event == CV_EVENT_LBUTTONDOWN )previousPoint = Point(x,y);//鼠標按下并移動,進行繪制else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON) ){Point pt(x,y);if( previousPoint.x < 0 )previousPoint = pt;//繪制白色線條// 同時在源圖和掩模圖 中繪制涂鴉;line( inpaintMask, previousPoint, pt, Scalar::all(255), 5, 8, 0 );line( srcImage1, previousPoint, pt, Scalar::all(255), 5, 8, 0 );previousPoint = pt;imshow(WINDOW_NAME1, srcImage1);} }結果:
CV_INPAINT_TELEA 算法:
CV_INPAINT_NS 算法:
總結
以上是生活随笔為你收集整理的OpenCV学习笔记(十七):图像修补:inpaint()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现随机乱序/洗牌
- 下一篇: JavaSE——IO(下)(Proper