【從零學習OpenCV 4】影像修復
- 2020 年 3 月 5 日
- 筆記
經過幾個月的努力,小白終於完成了市面上第一本OpenCV 4入門書籍《OpenCV 4開發詳解》。為了更讓小夥伴更早的了解最新版的OpenCV 4,小白與出版社溝通,提前在公眾號上連載部分內容,請持續關注小白。 |
---|
在實際應用或者工程中,影像常常會收到雜訊的干擾,例如在拍照時鏡頭上存在灰塵或者飛行的小動物,這些干擾會導致拍攝到的影像出現部分內容被遮擋的情況。對於較為久遠的影像,可能只有實體影像而沒有數字存儲形式的底板,因此相片在保存和運輸過程中可能產生劃痕,導致影像中資訊的損壞和丟失。
影像修復技術就是利用影像中損壞區域邊緣的像素,根據像素值的大小以及像素間的結構關係,估計出損壞區域可能的像素排列,從而去除影像中受污染的區域。影像修復不僅可以去除影像中得「劃痕」,還可以去除影像中得水印、日期等。
OpenCV 4提供了能夠對含有較少污染或者水印的影像進行修復的inpaint()函數,該函數的函數原型在程式碼清單8-26中給出。
程式碼清單8-26 inpaint()函數清單 void cv::inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags )
- src:輸入待修復影像,當影像為單通道時,數據類型可以是CV_8U、CV_16U或者CV_32F,當影像為三通道時數據類型必須是CV_8U。
- inpaintMask:修復掩模,數據類型為CV_8U的單通道影像,與待修復影像具有相同的尺寸。
- dst:修復後輸出影像,與輸入影像具有相同的大小和數據類型。
- inpaintRadius:演算法考慮的每個像素點的圓形鄰域半徑。
- flags:修復方法標誌,可以選擇的參數及含義在表8-7給出
該函數利用影像修復演算法對影像中指定的區域進行修復,函數無法判定哪些區域需要修復,因此在使用過程中需要明確指出需要修復的區域。函數的第一個參數是需要修復的影像,該函數可以對灰度影像和彩色影像進行修復。修復灰度影像時,影像的數據類型可以為CV_8U、CV_16U或者CV_32F;修復彩色影像時,影像的數據類型只能為CV_8U。第二個參數是修復掩碼,即指定影像中需要修復的區域,該參數輸入量是一個與影像具有相同尺寸的數據類型為CV_8U的單通道影像,影像中非0像素表示需要修復的區域。函數的第三個 參數是修復後的輸出影像,與輸入影像具有相同的大小和數據類型。第四個參數表示修復演算法考慮的每個像素點的圓形鄰域半徑。最後一個參數表示修復影像方法標誌,可以選擇的參數及含義在表8-7給出。
該函數雖然可以對影像受污染區域進行修復,但是需要藉助污染邊緣區域的像素資訊,離邊緣區域越遠的像素估計出的準確性越低,因此如果受污染區域較大,修復的效果就會降低。
標誌參數 |
簡記 |
含義 |
---|---|---|
INPAINT_NS |
0 |
基於Navier-Stokes演算法修復影像 |
INPAINT_TELEA |
1 |
基於Alexandru Telea演算法修復影像 |