何 春,宋國(guó)琴
(西華師范大學(xué) 教育信息技術(shù)中心,四川 南充 637002)
?
一種基于雙邊濾波的HDR算法
何 春,宋國(guó)琴
(西華師范大學(xué) 教育信息技術(shù)中心,四川 南充 637002)
為了能讓高動(dòng)態(tài)范圍圖像顯示在低動(dòng)態(tài)范圍輸出設(shè)備上,需對(duì)高動(dòng)態(tài)范圍圖像進(jìn)行壓縮處理.算法根據(jù)雙邊濾波的原理對(duì)輸入的圖像信息進(jìn)行分解,得到保留圖像亮度信息的基礎(chǔ)層和表示圖像反射率信息的細(xì)節(jié)層,然后降低基礎(chǔ)層的對(duì)比度,保留細(xì)節(jié)層的信息,最后再將兩層的數(shù)據(jù)進(jìn)行合并,輸出最終的圖像.實(shí)驗(yàn)表明,算法較好地還原了圖像細(xì)節(jié),有效地調(diào)節(jié)了圖像亮度,使之更好地適應(yīng)了人眼視覺系統(tǒng)的感知范圍.
HDR圖像;雙邊濾波;色調(diào)映射;圖像壓縮
高動(dòng)態(tài)范圍成像(High Dynamic Range Imaging,HDRI)是一種能夠比普通數(shù)字成像技術(shù)曝光更大動(dòng)態(tài)范圍的技術(shù),該技術(shù)能夠記錄更加真實(shí)的場(chǎng)景,通過該技術(shù)得到的圖像稱為高動(dòng)態(tài)范圍(High Dynamic Range)圖像[1].HDR圖像可以通過光譜記錄儀器或多幅同一場(chǎng)景不同曝光時(shí)間的圖像序列合成而獲得.相對(duì)于HDR圖像的動(dòng)態(tài)范圍,當(dāng)前的輸出設(shè)備(顯示器、打印機(jī)等)的動(dòng)態(tài)范圍極其有限,所以要將HDR圖像在輸出設(shè)備上顯示出來(lái),必須將其高動(dòng)態(tài)范圍轉(zhuǎn)換至輸出設(shè)備能夠接受的低動(dòng)態(tài)范圍內(nèi),該轉(zhuǎn)換過程稱為色階重建(Tone Reproduction)或色調(diào)映射(Tone Mapping).
目前色調(diào)映射算法(Tone Mapping Operator,TMO)分為兩類:全局映射算法和局部映射算法[2].全局映射算法通過像素間點(diǎn)到點(diǎn)的對(duì)應(yīng)函數(shù)對(duì)HDR圖像中的每個(gè)像素進(jìn)行映射,其優(yōu)點(diǎn)在于計(jì)算速度快,能夠保持良好的整體明暗的視覺效果,但是全局映射會(huì)造成細(xì)節(jié)信息的嚴(yán)重丟失.局部映射算法對(duì)圖像的不同區(qū)域使用不同的比例因子進(jìn)行映射,映射中對(duì)較小的對(duì)比度進(jìn)行增強(qiáng),對(duì)較大的對(duì)比度進(jìn)行壓縮,從而保留了圖像分細(xì)節(jié)信息.算法的優(yōu)點(diǎn)在于映射后可以產(chǎn)生細(xì)節(jié)豐富的圖像,但該類算法需要對(duì)圖像進(jìn)行分層處理,處理不好會(huì)在分層合成后的圖像邊緣處出現(xiàn)光暈現(xiàn)象或局部削弱.
本文采用Durand等提出基于雙邊濾波技術(shù)的HDR圖像色調(diào)映射算法[3],在計(jì)算HDR圖像的像素亮度值后,利用雙邊濾波將圖像分為基礎(chǔ)層和細(xì)節(jié)層,然后降低基礎(chǔ)層的對(duì)比度,保留細(xì)節(jié)層的信息,最后再將兩層的數(shù)據(jù)進(jìn)行合并,輸出最終的圖像.
1.1 雙邊濾波技術(shù)
雙邊濾波器是Tomasi和Manduchi于1998年提出的圖像濾波算法[4],該算法結(jié)合鄰域空間信息和像素值相似性對(duì)圖像進(jìn)行濾波處理,在平滑濾波的同時(shí)能夠保留圖像的邊緣特征.
雙邊濾波器由2個(gè)高斯核函數(shù)組成:鄰域?yàn)V波和值域?yàn)V波.鄰域?yàn)V波可以對(duì)鄰域空間上相近的像素點(diǎn)進(jìn)行加權(quán)平均,加權(quán)的系數(shù)隨著像素點(diǎn)距離的增大而減小.值域?yàn)V波是對(duì)像素值相近的點(diǎn)進(jìn)行加權(quán)平均,加權(quán)系數(shù)隨著像素點(diǎn)值差的增大而減小.
雙邊濾波定義如下:
(1)
k(b)=∑p∈Ωf(p-b)g(Ip-Ib)
(2)
其中,I為輸入圖像,b為輸出圖像,Ω為鄰域窗口,f和g分別為2個(gè)高斯核函數(shù),f為鄰域范圍內(nèi)濾波,g為像素值領(lǐng)域內(nèi)濾波,Ip和Ib分別為p點(diǎn)和b點(diǎn)的像素值.
高斯核函數(shù)在圖像處理中定義如下:
(3)
(4)
其中d(p,d)為2個(gè)像素點(diǎn)的歐幾里得距離,δ(Ip,Ib)為2個(gè)像素點(diǎn)灰度差值,σd為空間鄰域標(biāo)準(zhǔn)差,σr為像素亮度標(biāo)準(zhǔn)差.
由以上定義可知,雙邊濾波的權(quán)系數(shù)由空間鄰域標(biāo)準(zhǔn)差σd和像素亮度標(biāo)準(zhǔn)差σr組成,這兩個(gè)參數(shù)值的選擇非常重要,直接影響到雙邊濾波的輸出效果.多次實(shí)驗(yàn)表明,σd取值0.02×max(width, height)、σr取值0.4時(shí)較為合適.
1.2 算法設(shè)計(jì)
算法首先將HDR圖像分成兩層:基礎(chǔ)層和細(xì)節(jié)層.基礎(chǔ)層保留圖像亮度信息,細(xì)節(jié)層表示圖像反射率信息[5].根據(jù)Durand等人提出的快速雙向?yàn)V波器原理對(duì)輸入的圖像信息進(jìn)行分解如下:
I(x, y)=log(max(Lw(x, y),0.0001)
(5)
Ibase(x,y)=bil_filter(I(x, y))
(6)
Idetail(x,y)=I(x, y)-Ibase(x, y)
(7)
其中,Lw(x, y)為輸入HDR圖像的亮度值,I(x, y)是對(duì)輸入圖像取對(duì)數(shù)(以10為底),Ibase(x,y)為雙向?yàn)V波器的輸出結(jié)果,該結(jié)果即為圖像基本層,Idetail(x,y)作為圖像細(xì)節(jié)層被定義為原圖像與基本層之差.
根據(jù)以上分解,算法的完整過程如下:
(1)將原始圖像每個(gè)像素的R、G、B值進(jìn)行分解,并按照以下公式求出原始圖像的光照強(qiáng)度(即亮度信息),該結(jié)果保存在基礎(chǔ)層里[6]:Lw(x, y)= (R*20+G*40+B) /61.
(2)按以下方法求出R、G、B分量各自占光照強(qiáng)度的比例,得到相應(yīng)的比例值r、g、b.r=R/Lw (x, y), g=G/Lw (x, y), b=B/Lw (x, y).
(3)對(duì)原始圖像的亮度信息進(jìn)行雙邊濾波處理,處理后得到基礎(chǔ)層的圖像信息:Ibase(x,y)=bil_filter(I(x, y)).
(4)計(jì)算原圖像與基本層之差,即圖像細(xì)節(jié)層:Idetail(x,y)=I(x, y)-Ibase(x, y).
(5)通過以下計(jì)算公式得到圖像經(jīng)過處理后的細(xì)節(jié)信息[7]:Iresult(x, y)=Ibase(x, y)*compressionfactor+
Idetail(x,y)-log_absolute_scale.
(6)分別求出圖像經(jīng)過處理后得到的R、G、B分量值:Rresult= r*10^Iresult(x, y)),Gresult=g*10^Iresult(x, y)),Bresult= b*10^Iresult(x, y)).
其中,compressionfactor=targetContrast/(max
(Ibase(x,y))-min(Ibase(x,y))),targetContrast取值log(5)較為理想;log_absolute_scale=max(Ibase(x, y))*compressionfactor.
1.3 算法代碼
根據(jù)上述算法設(shè)計(jì),下面提供該算法的部分C語(yǔ)言代碼:
public Bitmap LoadHdrFormFreeImage(string FileName)
{ Bitmap Bmp = null;
FREE_IMAGE_FORMAT fif = FREE_IMAGE_FORMAT.FIF_UNKNOWN;
if (FreeImage.IsAvailable() == true)
{ fif = FreeImage.GetFileType(FileName, 0);
if (fif != FREE_IMAGE_FORMAT.FIF_HDR)
{
MessageBox.Show(“不是HDR格式的圖像.”);
return null;
}
fif = FreeImage.GetFIFFromFilename(FileName);
FIBITMAP Dib = FreeImage.Load(fif, FileName, FREE_IMAGE_LOAD_FLAGS.DEFAULT);
uintBpp = FreeImage.GetBPP(Dib);
if (Bpp != 96)
{
MessageBox.Show(“無(wú)法支持的HDR格式.”);
FreeImage.Unload(Dib);
return null;
}
uint Width = FreeImage.GetWidth(Dib); // 圖像寬度
uint Height = FreeImage.GetHeight(Dib); // 圖像高度
uint Stride = FreeImage.GetPitch(Dib);
IntPtr Bits = FreeImage.GetBits(Dib);
float* Data = (float*)Bits;
int Speed, Index;
byte* Pixel;
float Value;
if (RawData != null) Marshal.FreeHGlobal((IntPtr)RawData);
RawData = (float*)Marshal.AllocHGlobal((int)Width * (int)Height * 3 * sizeof(float));
CopyMemory(RawData, Data, (int)Width * (int)Height * 3 * sizeof(float));
Bmp = new Bitmap((int)Width, (int)Height, PixelFormat.Format24bppRgb);
BitmapDataBmpData = Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
Pixel = (byte*)BmpData.Scan0;
for (int Y = 0; Y < Height; Y++)
{
Speed = Y * BmpData.Stride;
Index = Y * (int)Width * 3;
for (int X = 0; X < Width; X++)
{
Value = (Data[Index + 2] * 255);
if (Value > 255)
Value = 255;
else if (Value < 0)
Value = 0;
Pixel[Speed] = (byte)Value;
Value = (Data[Index + 1] * 255);
if (Value > 255)
Value = 255;
else if (Value < 0)
Value = 0;
Pixel[Speed + 1] = (byte)Value;
Value = (Data[Index + 0] * 255);
if (Value > 255) then Value = 255;
else if (Value < 0)then Value = 0;
Pixel[Speed + 2] = (byte)Value;
Index += 3;
Speed += 3;
}
}
FreeImage.Unload(Dib);
Bmp.UnlockBits(BmpData);
Bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
return Bmp;
}
else
return null;
}
為了驗(yàn)證本算法的有效性以及細(xì)節(jié)保持特性,實(shí)驗(yàn)對(duì)多張圖像進(jìn)行了處理.如圖1、圖2所示.
圖1 實(shí)驗(yàn)效果1
雖然目前對(duì)HDR圖像的色調(diào)映射算法及結(jié)果的評(píng)價(jià)方法還沒有客觀標(biāo)準(zhǔn)體系,但從算法處理的效果圖中我們可以看到本算法對(duì)于圖像的處理能夠
圖2 實(shí)驗(yàn)效果2
得到基本滿意的結(jié)果.圖1、圖2的黑暗部分都得到了有效的亮度調(diào)整以及細(xì)節(jié)還原,通過色階的對(duì)比也可以發(fā)現(xiàn)處理后效果圖的色階相比原圖在暗調(diào)、中間調(diào)、亮調(diào)區(qū)域分布更均勻,圖像不再有過曝或曝光不足的現(xiàn)象.但仍然可以發(fā)現(xiàn),處理后的圖像整體缺乏一定的層次感,局部細(xì)節(jié)信息仍有不同程度的丟失,這也是本算法需要進(jìn)一步改進(jìn)的地方.
本文算法根據(jù)雙邊濾波的原理對(duì)輸入的圖像信息進(jìn)行分解,得到保留圖像亮度信息的基礎(chǔ)層和表示圖像反射率信息的細(xì)節(jié)層,然后降低基礎(chǔ)層的對(duì)比度,保留細(xì)節(jié)層的信息,最后再將兩層的數(shù)據(jù)進(jìn)行合并,輸出最終的圖像.通過實(shí)驗(yàn)表明,算法對(duì)圖像的局部和整體實(shí)現(xiàn)了較好的結(jié)合,對(duì)于暗部圖像及亮部圖像的細(xì)節(jié)也實(shí)現(xiàn)了很好的還原,圖像的亮度得到了有效的調(diào)節(jié),圖像的動(dòng)態(tài)范圍大大提高,使之更好地適應(yīng)了人眼視覺系統(tǒng)的感知范圍.算法需要改進(jìn)的是,進(jìn)一步降低計(jì)算復(fù)雜度,圖像處理后的效果也需進(jìn)一步完善.
[1]李曉光,沈蘭蓀,林健文.一種高動(dòng)態(tài)范圍圖像可視化算法[J].計(jì)算機(jī)應(yīng)用研究,2007(11).
[2]Qiu G,Duan J.An optimal tone reproduction curve operator for the display high dynamic range images. Proceedings-IEEE International Symposium on Circuits and Systems,2005,ISCAS2005.
[3]Durand F, Dorsey J.Fast Bilateral Filtering for the Display of High-Dynamic-Range Images[J].ACM Transaction on Graphics,2002,21(3):257-266.
[4]Yue Dong,Xin Tong,Fabio Pellacini,BainingGuo. Printing spatially-varying reflectance for reproducing HDR images [J]. ACM Transactions on Graphics (TOG),2012 (4).
[5]朱明,劉真,李曉春.HDR圖像階調(diào)復(fù)制的非線性蒙版改進(jìn)算法[J].武漢大學(xué)學(xué)報(bào)(信息科學(xué)版),2014(08).
[6]劉冬梅,趙宇明.高動(dòng)態(tài)范圍圖像梯度壓縮算法[J].計(jì)算機(jī)工程,2009(20).
[7]舒妮,陳孝威.HDRI合成中新的相機(jī)響應(yīng)曲線算法[J].計(jì)算機(jī)工程與設(shè)計(jì),2012(03).
(責(zé)任編輯:王前)
2016-06-10
何春,女,四川南充人,講師.
TP391
A
1008-7974(2016)05-0051-03
10.13877/j.cnki.cn22-1284.2016.10.017