Opencv--图像修复
Opencv–圖像修復(fù)
前言
在實(shí)際應(yīng)用中,我們的圖像常常會被噪聲腐蝕,這些噪聲或是鏡頭上的灰塵或水滴,或是舊照片的劃痕,或者是圖像遭到人為的涂畫(比如馬賽克)或者圖像的部分本身已經(jīng)損壞。如果我們想讓這些受到破壞的額圖片盡可能恢復(fù)到原樣,Opencv能幫我們做到嗎?
OpenCV真的有這個(gè)妙手回春的功能!別以為圖像修補(bǔ)的工作只能用PS或者美圖秀秀那些軟件去做,其實(shí)由程序員自己寫代碼去做更加高效!
圖像修復(fù)技術(shù)的原理是什么呢?
簡而言之,就是利用那些已經(jīng)被破壞的區(qū)域的邊緣, 即邊緣的顏色和結(jié)構(gòu),根據(jù)這些圖像留下的信息去推斷被破壞的信息區(qū)的信息內(nèi)容,然后對破壞區(qū)進(jìn)行填補(bǔ) ,以達(dá)到圖像修補(bǔ)的目的。
OpenCV中就是利用inpaint()這個(gè)函數(shù)來實(shí)現(xiàn)修復(fù)功能的。
void inpaint( InputArray src, InputArray inpaintMask,OutputArray dst, double inpaintRadius, int flags );第一個(gè)參數(shù)src,輸入的單通道或三通道圖像;
第二個(gè)參數(shù)inpaintMask,圖像的掩碼,單通道圖像,大小跟原圖像一致,inpaintMask圖像上除了需要修復(fù)的部分之外其他部分的像素值全部為0;
第三個(gè)參數(shù)dst,輸出的經(jīng)過修復(fù)的圖像;
第四個(gè)參數(shù)inpaintRadius,修復(fù)算法取的鄰域半徑,用于計(jì)算當(dāng)前像素點(diǎn)的差值;
第五個(gè)參數(shù)flags,修復(fù)算法,有兩種:INPAINT_NS 和I NPAINT_TELEA;
函數(shù)實(shí)現(xiàn)關(guān)鍵是圖像掩碼的確定,可以通過閾值篩選或者手工選定,按照這個(gè)思路,用三種方法生成掩碼,對比圖像修復(fù)的效果。
示例:pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。
#include <imgproc\imgproc.hpp> #include <highgui\highgui.hpp> #include <photo\photo.hpp>using namespace cv;//全區(qū)域閾值處理+Mask膨脹處理 int main() {Mat imageSource = imread("lol17.png");if (!imageSource.data){return -1;}imshow("原圖", imageSource);Mat imageGray;//轉(zhuǎn)換為灰度圖cvtColor(imageSource, imageGray, CV_RGB2GRAY, 0);Mat imageMask = Mat(imageSource.size(), CV_8UC1, Scalar::all(0));//通過閾值處理生成Maskthreshold(imageGray, imageMask, 240, 255, CV_THRESH_BINARY);Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3));//對Mask膨脹處理,增加Mask面積dilate(imageMask, imageMask, Kernel);//圖像修復(fù)inpaint(imageSource, imageMask, imageSource, 5, INPAINT_TELEA);imshow("Mask", imageMask);imshow("修復(fù)后", imageSource);waitKey(); }下面就是修復(fù)效果,感覺很不錯(cuò)吧!不過仔細(xì)一看,感覺跟原圖還是發(fā)生了一些差異,比如圖中劍圣頭上的那顆亮點(diǎn),顏色發(fā)生了變化。這個(gè)就是修復(fù)后的副作用!畢竟作出了修復(fù),付點(diǎn)代價(jià)還是要的。受損是由于是圖像全區(qū)域做閾值處理獲得的掩碼,圖像上部分區(qū)域也被當(dāng)做掩碼對待,導(dǎo)致部分圖像受損。
有些圖片可能就會修復(fù)得很好,比如以下這幅,你根本看不出哪里有明顯的副作用。
是不是所有受損的圖片都能較好地還原呢?那當(dāng)然不是,有些圖片受損太嚴(yán)重的,或者在某些復(fù)雜區(qū)域受損的,OpenCV也很難幫你修復(fù)過來。
比如以下這幅,因?yàn)槭軗p有些區(qū)域在一些很復(fù)雜的位置,所以修復(fù)起來效果不怎么樣。
上面提到其他無辜的而區(qū)域會受損,這個(gè)問題能解決一下嗎?可以的,那就得自己定義一塊需要修復(fù)的而區(qū)域,不需要修復(fù)的區(qū)域我們不動它就是了。
這種方法就需要我們?nèi)藶榈禺嫵鲆迯?fù)的區(qū)域,這樣就不會影響區(qū)域之外的圖像了。
首先按住鼠標(biāo)左鍵將待修復(fù)區(qū)域框出來。
修復(fù)的而效果確實(shí)比上面的方法要好!
總而言之,圖像修復(fù)技術(shù)在一些簡單,顏色單調(diào)的圖像上進(jìn)行修復(fù)得到的而效果是相當(dāng)好的,而在一些細(xì)節(jié)或者復(fù)雜的部分進(jìn)行修復(fù),得到的復(fù)原圖像的效果就比較一般了。比如在一些背景部分進(jìn)行修復(fù)效果都不錯(cuò),而在邊緣細(xì)節(jié)上的修復(fù)就能看出問題了!
總結(jié)
以上是生活随笔為你收集整理的Opencv--图像修复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 左中右抽屉
- 下一篇: 苹果带计算机记录工作和备忘录一样的软件,