《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补
生活随笔
收集整理的這篇文章主要介紹了
《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
8.6 圖像修補
基本思想:
??利用已經(jīng)被破壞區(qū)域的邊緣,即邊緣的顏色和結(jié)構(gòu),繁殖和混合到損壞的圖像中,達(dá)到圖像修補的目的。
8.6.1 實現(xiàn)圖像修補:inpaint()函數(shù)
1.作用:
??用來從掃描的照片中清除灰塵和劃痕,從靜態(tài)圖像或視頻中去除不需要的物體
2.函數(shù)原型:
void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)
3.參數(shù)說明:
(1)輸入圖像,8位單通道或三通道
(2)修復(fù)掩模,8位單通道,其中的非零像素表示需要修補區(qū)域
(3)修補后圖像
(4)需要修補的每個點的圓形區(qū)域,為修復(fù)算法的參考半徑
(5)修補方法的標(biāo)識符,可取值:
??1)INPAINT_NS:基于Navier-Stokes方程的方法
??2)INPAINT_TELEA:Alexandru Telea方法
8.6.2 綜合示例
/*程序說明:鼠標(biāo)繪制白色線條破壞原圖像圖像鍵盤按鍵【1】啟動進(jìn)行圖像修復(fù)按鍵【2】恢復(fù)原始圖像
*/#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 "【修復(fù)效果圖】"
//全局變量
Mat g_srcImage, g_inpaintMask;
Point previousPoint(-1, -1); //原來的點坐標(biāo)
//全局函數(shù)
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);//設(shè)置鼠標(biāo)回調(diào)消息setMouseCallback(WINDOW_NAME1, on_Mouse, 0);//按鍵輪詢while (1){//獲取按鍵鍵值char c = (char)waitKey();//鍵值為ESC,程序退出if (c == 27) break;//鍵值為2,恢復(fù)原始圖像if (c == '2'){g_inpaintMask = Scalar::all(0);srcImage.copyTo(g_srcImage);imshow(WINDOW_NAME1, g_srcImage);}//鍵值為1,進(jìn)行圖像修復(fù)if (c == '1'){Mat inpaintedImage;inpaint(g_srcImage, g_inpaintMask, inpaintedImage, 3, INPAINT_TELEA);imshow(WINDOW_NAME2, inpaintedImage);}}return 0;
}
//鼠標(biāo)回調(diào)函數(shù)
static void on_Mouse(int event, int x, int y, int flags, void*)
{//鼠標(biāo)左鍵彈起消息if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON)){previousPoint = Point(-1, -1);}//鼠標(biāo)左鍵按下消息else if (event == EVENT_LBUTTONDOWN){previousPoint = Point(x, y);}//鼠標(biāo)按下狀態(tài)并移動,進(jìn)行繪制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歡迎來到【圖像修復(fù)】示例程序~\n");printf("\n\t請再進(jìn)行圖像修復(fù)操作之前,在【原始圖】窗口中進(jìn)行適量的繪制\n");printf("\n\t按鍵操作說明:\n");printf("\t\t\t鍵盤按鍵【1】--進(jìn)行圖像修復(fù)\n");printf("\t\t\t鍵盤按鍵【2】--恢復(fù)原始圖\n");printf("\t\t\t鍵盤按鍵【ESC】--退出程序\n");
}
運行效果:
總結(jié)
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《OpenCV3编程入门》学习笔记8 图
- 下一篇: 《OpenCV3编程入门》学习笔记9 直