1. 程式人生 > >基於Retinex的影象去霧演算法(MATLAB實現)

基於Retinex的影象去霧演算法(MATLAB實現)

在【影象處理中的數學原理】專欄(該專欄中的文章已經結集出版,書名為《影象處理中的數學修煉》)之前的一些文章中,我們已經討論了諸多非常有用的影象增強演算法,例如直方圖均衡演算法以及更加強大的CLAHE。通常影象增強演算法或多或少都有一定的去霧效果,只是這個效果有強有若罷了。本文將討論另外一類十分重要的影象增強演算法——Retinex演算法。並在MATLAB中實驗一下這類方法的去霧效果。

提及影象去霧演算法,【影象處理中的數學原理】專欄中也已經討論過兩個非常有名的演算法:基於暗通道先驗的影象去霧演算法基於優化對比度增強的影象去霧演算法,對影象去霧這一話題仍然感覺比較陌生的讀者不妨先仔細讀讀上面兩篇文章。

歡迎關注白馬負金羈的部落格 http://blog.csdn.net/baimafujinji,為保證公式、圖表得以正確顯示,強烈建議你從該地址上檢視原版博文。本部落格主要關注方向包括:數字影象處理、演算法設計與分析、資料結構、機器學習、資料探勘、統計分析方法、自然語言處理。

最基本的Retinex理論與演算法

Retinex是一種常用的建立在科學實驗和科學分析基礎上的影象增強方法,它是以人類視覺系統為出發點發展而來的一套理論方法,最早由埃德溫•蘭德(Edwin. H. Land)於1963年提出。Retinex是由兩個單詞合成的一個詞語,他們分別是retina 和cortex,即視網膜和皮層。

Retinex理論的基本內容是物體的顏色是由物體對長波(紅色)、中波(綠色)、短波(藍色)光線的反射能力來決定的,而不是由反射光強度的絕對值來決定的,物體的色彩不受光照非均勻性的影響,具有一致性,即Retinex是以色感一致性(顏色恆常性)為基礎的。

根據蘭德提出的理論,一幅給定的影象S(x,y)可以分解為兩個不同的影象:反射影象R(x,y)和亮度影象(或稱之為入射影象)L(x,y),其原理如下圖所示。

對於給定影象S中的每個點(x,y),用公式可以表示為:S(x,y)=R(x,y)L(x,y)實際上,Retinex理論就是通過影象S來得到物體的反射性質R,也就是設法去除(或者降低)入射光L
的影響從而得到物體原本該有的樣子。但是具體該如何來估計R並沒有一個明確的答案,因此根據不同的估計方法,也就產生了各種各樣的Retinex演算法。

單尺度的Retinex演算法(SSR, Single Scale Retinex)是最基礎、最簡單的一種Retinex演算法,而且這個演算法也給出了廣義上Retinex演算法的大致框架。

  • Step1:利用取對數的方法將照射光分量和反射光分量分離,即logS(x,y)=logR(x,y)+logL(x,y)
  • Step2:一般我們會把最終的反射影象假設地估計為空間平滑影象(其物理解釋就是通過計算影象中畫素點與周圍區域中畫素的加權平均來對影象中照度變化做估計,並將其去除,最後只保留影象中物體的反射屬性),所以可以用高斯模板對原影象作卷積,即相當於對原影象作低通濾波,得到低通濾波後的影象D(x,y)F(x,y)表示高斯濾波函式:D(x,y)=S(x,y)F(x,y)
  • Step3:在對數域中,用原影象減去低通濾波後的影象,得到高頻增強的影象G(x,y)G(x,y)=logS(x,y)logD(x,y)
  • Step4:對G(x,y)取反對數,得到增強後的影象R(x,y)R(x,y)=expG(x,y)

基於SSR演算法便可以實現一個基本的影象去霧程式。下面的MATLAB程式碼是完全按照上面的思路來實現的。只是在最後,對R(x,y)作對比度增強,以得到最終的去霧影象。此外,因為這裡處理的是彩色影象,所以我們對R、G、B三個通道分別進行了處理。

I = imread('canon.jpg');

R = I(:, :, 1);
[N1, M1] = size(R);
R0 = double(R);
Rlog = log(R0+1);
Rfft2 = fft2(R0);

sigma = 250;
F = fspecial('gaussian', [N1,M1], sigma);
Efft = fft2(double(F));

DR0 = Rfft2.* Efft;
DR = ifft2(DR0);

DRlog = log(DR +1);
Rr = Rlog - DRlog;
EXPRr = exp(Rr);
MIN = min(min(EXPRr));
MAX = max(max(EXPRr));
EXPRr = (EXPRr - MIN)/(MAX - MIN);
EXPRr = adapthisteq(EXPRr);

G = I(:, :, 2);

G0 = double(G);
Glog = log(G0+1);
Gfft2 = fft2(G0);

DG0 = Gfft2.* Efft;
DG = ifft2(DG0);

DGlog = log(DG +1);
Gg = Glog - DGlog;
EXPGg = exp(Gg);
MIN = min(min(EXPGg));
MAX = max(max(EXPGg));
EXPGg = (EXPGg - MIN)/(MAX - MIN);
EXPGg = adapthisteq(EXPGg);

B = I(:, :, 3);

B0 = double(B);
Blog = log(B0+1);
Bfft2 = fft2(B0);

DB0 = Bfft2.* Efft;
DB = ifft2(DB0);

DBlog = log(DB+1);
Bb = Blog - DBlog;
EXPBb = exp(Bb);
MIN = min(min(EXPBb));
MAX = max(max(EXPBb));
EXPBb = (EXPBb - MIN)/(MAX - MIN);
EXPBb = adapthisteq(EXPBb);

result = cat(3, EXPRr, EXPGg, EXPBb);
subplot(121), imshow(I);
subplot(122), imshow(result);

這裡使用了兩幅常用的有霧影象來做實驗,其中左側的影象為有霧影象,右側影象是基於SSR實現的去霧後的效果圖,可見SSR除了對影象進行了一定的增強之外,也有一定的去霧效果。




更多影象處理中的數學問題請參考《影象處理中的數學修煉》,也歡迎廣大讀者到影象處理書籍讀者群中參與討論學習,並交流關於影象增強演算法和影象復原演算法的研究心得。

多尺度Retinex演算法與MSRCR

多尺度Retinex演算法(MSR)是從SSR發展而來的一種Retinex演算法,它的基本公式如下:

R(x,y)=kKwk{logS(x,y)logFk(x,y)S(x,y)}其中,R(x,y)是Retinex的輸出(這與之前介紹SSR時的情況一致),iR,G,B表示三個顏色通道,F(x,y)是高斯濾波函式。wk表示尺度的權重因子,K表示使用的尺度數目。K=3 即表示彩色影象(此時通道i有紅、綠、藍三個);K=1 表示灰度影象,即只有一個顏色通道。上式公式也揭示了MSR演算法的特點,也就是在輸出影象時,能夠兼顧到色調再現和動態範圍壓縮兩個特性。

在MSR演算法的增強過程中,影象可能會因為增加了噪聲而導致影象中區域性區域的色彩失真,使得物體真正的顏色效果不能很好地顯現出來,從而影響了整體的視覺觀感。為了改進這方面的不足,一般情況下會使用帶色彩恢復因子C的多尺度演算法(MSRCR)來解決(Rehman等提出)。帶色彩恢復因子C的多尺度演算法是在多個固定尺度的基礎上考慮色彩不失真恢復的結果,在多尺度Retinex演算法過程中,通過引入一個色彩因子C來彌補由於影象區域性區域對比度增強而導致的影象顏色失真的缺陷,通常情況下所引入的色彩恢復因子C的表示式為:

RMSRCRi(x,y)=Ci(x,y)RMSRi(x,y)Ci(x,y)=f[Ii(x,y)Nj=1Ij(x,y)]其中,Ci表示第i個通道的色彩恢復係數,它的作用是調節3個通道顏色的比例,f()表示顏色空間的對映函式,通常可以採用下面的形式:Ci(x,y)=βlogαIi(x,y)N

相關推薦

基於Retinex影象演算法MATLAB實現

在【影象處理中的數學原理】專欄(該專欄中的文章已經結集出版,書名為《影象處理中的數學修煉》)之前的一些文章中,我們已經討論了諸多非常有用的影象增強演算法,例如直方圖均衡演算法以及更加強大的CLAHE。通常影象增強演算法或多或少都有一定的去霧效果,只是這個效果有強

《推薦系統實踐》——基於物品的協同過濾演算法程式碼實現

一、基礎演算法 基於物品的協同過濾演算法(簡稱ItemCF)給使用者推薦那些和他們之前喜歡的物品相似的物品。不過ItemCF不是利用物品的內容計算物品之間相似度,而是利用使用者的行為記錄。 該演算法認為,物品A和物品B具有很大的相似度是因為喜歡物品A的使用者

數字影象處理,經典濾波演算法噪對比實驗Matlab實現

一,經典濾波演算法的基本原理 1,中值濾波和均值濾波的基本原理 參考以前轉載的部落格:http://blog.csdn.net/ebowtang/article/details/38960271

matlab暗通道影象演算法實現

何凱明的經典去霧演算法,啥都不說啦,直接上程式碼,OK! main.m clear clc close all kenlRatio = 0.01; minAtomsLight = 240; % image_name = 'test images\21.bm

影象演算法的原理、實現、效果

影象的去霧演算法原理及實現: 本文主要是實現的是基於暗通道處理的去霧。有部分是看論文直接翻譯而來,如有錯誤,歡迎評論區指出,當然您也可以直接閱讀原文。 一、原理 暗通道先驗解釋: 說明:何凱明博士的論文中統計了5000多副影象的特徵,證明了暗通道先驗理論的普遍性,因此

基於畫素清晰度的影象融合演算法Python實現

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import cv2 from math import log from PIL import Image import d

影象處理——快速均值濾波MATLAB實現

均值濾波是典型的線性濾波演算法,它是指在影象上對目標畫素給一個模板,該模板包括了其周圍的臨近畫素(以目標畫素為中心的周圍8個畫素,構成一個濾波模板,即去掉目標畫素本身),再用模板中的全體畫素的平均值來代替原來畫素值。 快速均值濾波要求: 在這裡就要先解釋一下積分圖

經典數字影象處理matlab 實現

Multi-Scale EPLL Linearized Kernel Dictionary Learning Trainlets: Dictionary Learning in High Dim

簡單橢圓曲線加密演算法ECC)示例MATLAB實現

摘要 本文主要是使用MATLAB演示橢圓曲線加密演算法(ECC)的加密/解密過程,內容包括金鑰、公鑰生成,以及通過加密並解密一個簡單數字的過程來描述其使用方法。 本文實際是對以下兩篇文章的一個MATLAB實現,並且提供了兩個實用的MATLAB工具函式以便在閱

暗通道演算法的python實現

    何凱明博士的去霧文章和演算法實現已經漫天飛了,我今天也就不囉裡囉唆,直接給出自己python實現的完整版本,全部才60多行程式碼,簡單易懂,並有簡要註釋,去霧效果也很不錯。     在這個python版本中,計算量最大的就是最小值濾波,純python寫的,慢,可

SVM+HOG對影象進行分類MATLAB實現

網上看到關於用opencv對影象進行分類的不少,這次用MATLAB做了些嘗試,影象資料集為:,其他MATLAB版本http://blog.csdn.net/libin88211/article/details/19968205 ,點選開啟連結,http://blog.csd

K-means聚類演算法的典型簡單應用Matlab實現

%matlab code % K-means Cluster %load data.dat %x,y的範圍為0~50,x_data是一個1行100列的行矩陣 x_data = 50*rand(1,100); y_data = 50*rand(1,100); % x_da

對稱矩陣與壓縮儲存演算法java實現

一、問題描述 實現一個對稱矩陣的壓縮儲存 二、演算法分析 對稱矩陣的特點:a[i][j] = a[j][i].即所有元素關於對角線對稱 所以可以將對稱矩陣的下三角儲存在一個數組物件SA中,儲存方式是, SA[0] = a[0][0] SA[1] = a[1][0]  

一種較為高效的TreeList生成演算法Delphi實現

記得不久前曾寫過篇關於TreeList生成的文章。雖然那個演算法裡,我已經有對葉節點做判斷,避免無用的Filter操作。但是非葉節點的Filter操作依然是無可避免的。而Filter又是影響整個生成的最重要因素,因此當帶子節點的節點很多時,速度還是要被拖下去的。 後來我看到了一種覺得不錯的思路,

二叉樹的遍歷演算法js實現

之前我的部落格中講到了如何通過js去實現一顆二叉樹,有興趣的可以去我的部落格中看下。今天我們來一起實現下二叉樹的遍歷演算法。歡迎大家幫忙指出不當之處,或者進行深入的挖掘。大家一起進步。二叉樹吶,有三種遍歷演算法,1:中序遍歷,2:先序遍歷,3:後序遍歷。在我們看具體實現之前,我們想下為什麼要這樣做?二叉樹廣泛

LeetCode加一演算法JS實現

給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。 最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。 你可以假設除了整數 0 之外,這個整數不會以零開頭。 示例 1: 輸入: [1,2,3] 輸出: [1,2,4] 解釋: 輸入陣列表示數字 1

實現奇偶數排序演算法JAVA實現

給定一個整數陣列,請調整陣列的順序,使得所有奇數位於陣列前半部分,所有偶數位於陣列後半部分,時間複雜度越小越好。 package com.sort; import java.util.Arrays; public class TestSort { /** * 測試方法 * @par

作業系統- 實驗四 模擬FIFO頁面置換演算法Java實現

                                          &

最大流之Ford-Fulkerson演算法C++實現

本文主要講解最大流問題的Ford-Fulkerson解法。可是說這是一種方法,而不是演算法,因為它包含具有不同執行時間的幾種實現。該方法依賴於三種重要思想:殘留網路,增廣路徑和割。 一、殘留網路 顧名思義,殘留網路是指給定網路和一個流,其對應還可以容納的流組成的網路。具體說來,就是假定一個網

最小生成樹之普里姆prim演算法C++實現

最小生成樹之普里姆(Prim)演算法   最小生成樹:是在一個給定的無向圖G(V,E)中求一棵樹T,使得這棵樹擁有圖G中的所有頂點,且所有邊都是來自圖G中的邊,並且滿足整棵樹的邊權之和最小。 如上圖給出了一個圖G及其最小生成樹T,其中紅色的線即為最小生成樹的邊。最小生成樹