基于快速去雾的图像亮度增强方法
起因
最近在做一個圖像處理的算法,因?yàn)閳D像太暗,所以需要對圖像的亮度進(jìn)行增強(qiáng)(不考慮噪聲的放大)。嘗試了網(wǎng)上搜索到的各種方法后,發(fā)現(xiàn)它們存在兩個問題:容易造成原本較亮的地方過曝,并且參數(shù)不好設(shè)置。嘗試了一些暗光增強(qiáng)的paper的算法后,發(fā)現(xiàn)它們又太慢了。這時我想到曾經(jīng)看過的一篇paper說過,有一種亮度增強(qiáng)的算法是基于去霧來做的,步驟很簡單:
1. 將RGB圖像取反(關(guān)于圖像取反,請參考我的這篇博客OpenCV圖像取反);
2. 對取反后的圖像進(jìn)行去霧;
3. 將去霧后的圖像取反。
其背后的理念是:暗光圖像取反后,原本接近黑色的像素就會變成接近白色,整張圖像就會類似于有霧的圖像。于是對這樣的圖像進(jìn)行去霧后,白色的像素就變暗了,再反色后,像素就變亮了!沒毛病!
快速去霧算法
說起去霧,恐怕大多數(shù)人的第一反應(yīng)就是鼎鼎大名的何愷明博士的暗通道先驗(yàn)去霧算法。我的第一反應(yīng)也是這個。但是在了解之后,我發(fā)現(xiàn)這種方法速度太慢了,難以應(yīng)用到我的算法中。于是我開始搜索快速的去霧算法,很快找到了這篇論文《基于單幅圖像的快速去霧算法》劉倩, 陳茂銀, 周東華(這篇文章中也提到了暗通道先驗(yàn)去霧算法的速度太慢),速度很快,只有O(1)復(fù)雜度。
這篇論文我并沒有仔細(xì)看,而是秉承“拿來主義”的精神,直接根據(jù)論文提供的算法流程實(shí)現(xiàn)了代碼。原因是它的算法流程太簡單了,在輕松地實(shí)現(xiàn)了代碼之后,就沒有再看的欲望了~這里貼一下它的算法流程,你們自己看:
源碼解釋
我把實(shí)現(xiàn)的代碼放到了GitHub:IBEABFHR(原諒我這個取名廢),請點(diǎn)進(jìn)去看效果圖,我這里就不重復(fù)放了。我感覺效果還是很好的,暗處的亮度增強(qiáng)得很好,亮處雖然有過曝,但并不是很明顯。而且控制亮度的參數(shù)很好調(diào)整,只要隨便找一張圖像調(diào)整好參數(shù),就可以應(yīng)用于所有圖片了。
運(yùn)行速度
代碼是用OpenCV實(shí)現(xiàn)的,同時支持彩色圖像和灰度圖像。在我的電腦上(CPU: E3-1230 v3)測試,運(yùn)行100次取平均值,速度如下:
| 1024x768 | 灰度圖像 | 8.77ms |
| 1024x768 | 彩色圖像 | 16.24ms |
| 1920x1080 | 灰度圖像 | 22.61ms |
| 1920x1080 | 彩色圖像 | 40.60ms |
| 4160x2340 | 灰度圖像 | 104.57ms |
| 4160x2340 | 彩色圖像 | 186.14ms |
但是如果你只使用我的算法一次,可能速度要慢得多,原因是第一次取反操作因?yàn)槲粗蚝馁M(fèi)了額外的時間。關(guān)于這點(diǎn),請參看我的這篇博客OpenCV圖像取反。
參數(shù)調(diào)整
這個算法總共有兩個可變參數(shù)。一個是在step 3中進(jìn)行均值濾波時的所用的濾波半徑radius,另一個是在step 5中用的ρ。
radius參數(shù)在某些圖像上可以控制對比度,數(shù)值越大,對比度越強(qiáng),但在某些圖像上不起作用。這個參數(shù)取值不能太小,否則增強(qiáng)后的圖像會出現(xiàn)光暈。一般不應(yīng)小于50或者圖像寬度和高度最大值的的1/20。
ρ控制圖像增強(qiáng)的亮度,數(shù)值越大,增強(qiáng)后的圖像越亮。一般的取值范圍為[1.0, 2.0]。在我的實(shí)現(xiàn)中,我使用了一種簡單選擇的策略,請參看源代碼,僅供參考。
關(guān)于參數(shù)的效果及設(shè)置,我參考了這篇博客一種可實(shí)時處理 O(1)復(fù)雜度圖像去霧算法的實(shí)現(xiàn),在此進(jìn)行感謝。
總結(jié)
以上是生活随笔為你收集整理的基于快速去雾的图像亮度增强方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据——Hadoop集群调优
- 下一篇: 小黄鸭c语言编程,小黄鸭调试法