灰度變換也被稱為圖像的點運算(只針對圖像的某一像素點)是所有圖像處理技術中最簡單的技術,其變換形式如下:
其中,T是灰度變換函數;r是變換前的灰度;s是變換后的像素。
圖像灰度變換的有以下作用:
改善圖像的質量,使圖像能夠顯示更多的細節,提高圖像的對比度(對比度拉伸);
有選擇的突出圖像感興趣的特征或者抑制圖像中不需要的特征;
可以有效的改變圖像的直方圖分布,使像素的分布更為均勻。
常見的灰度變換
灰度變換函數描述了輸入灰度值和輸出灰度值之間變換關系,一旦灰度變換函數確定下來了,那么其輸出的灰度值也就確定了。
可見灰度變換函數的性質就決定了灰度變換所能達到的效果。用于圖像灰度變換的函數主要有以下三種:
線性函數 (圖像反轉)
對數函數:對數和反對數變換
冪律函數:n次冪和n次開方變換
上圖給出了幾種常見灰度變換函數的曲線圖,根據這幾種常見函數的曲線形狀,可以知道這幾種變換的所能達到的效果。
例如,對數變換和冪律變換都能實現圖像灰度級的擴展/壓縮,另外對數變換還有一個重要的性質,它能壓縮圖像灰度值變換較大的圖像的動態范圍(例如,傅立葉變換的頻譜顯示)。
線性變換
令r為變換前的灰度,s為變換后的灰度,則線性變換的函數:
其中,a為直線的斜率,b為在y軸的截距。選擇不同的a,b值會有不同的效果:
a>1,增加圖像的對比度
a<1,減小圖像的對比度
a=1且b≠0a=1且b≠0,圖像整體的灰度值上移或者下移,也就是圖像整體變亮或者變暗,不會改變圖像的對比度。
a<0且b=0?a<0且b=0,圖像的亮區域變暗,暗區域變亮
a=1且b=0a=1且b=0,恒定變換,不變
a=?1且b=255a=?1且b=255,圖像反轉。
在進行圖像增強時,上述的線性變換函數用的較多的就是圖像反轉了,根據上面的參數,圖像反轉的變換函數為:s=255?s。
圖像反轉得到的是圖像的負片,能夠有效的增強在圖像暗區域的白色或者灰色細節。
其效果如下:
圖像反轉的實現是比較簡單的,在 OpenCV 中有對Mat的運算符重載,可以直接 Mat r = 255 - img 或者 ~img 來實現。
對數變換
對數變換的通用公式是:
其中,c是一個常數,,假設r≥0,根據上圖中的對數函數的曲線可以看出:對數變換,將源圖像中范圍較窄的低灰度值映射到范圍較寬的灰度區間,同時將范圍較寬的高灰度值區間映射為較窄的灰度區間,從而擴展了暗像素的值,壓縮了高灰度的值,能夠對圖像中低灰度細節進行增強。
從函數曲線也可以看出,反對數函數的曲線和對數的曲線是對稱的,在應用到圖像變換其結果是相反的,反對數變換的作用是壓縮灰度值較低的區間,擴展高灰度值的區間。
基于 OpenCV 的實現,其對數變換的代碼如下:
floatpixels[256]; for(inti=0;i256;?i++) ????????pixels[i]?=?log(1?+?i); ????Mat?imageLog(image.size(),?CV_32FC3); ????for?(int?i?=?0;?i(i,j)[0]=pixels[image.at (i,j)[0]]; imageLog.at (i,j)[1]=pixels[image.at (i,j)[1]]; imageLog.at (i,j)[2]=pixels[image.at (i,j)[2]]; } } //歸一化到0~255 normalize(imageLog,imageLog,0,255,CV_MINMAX); //轉換成8bit圖像顯示 convertScaleAbs(imageLog,imageLog);
這使用的對數函數的底為10。由于灰度變換是灰度值之間的一對一的映射,而灰度值區間通常為[0,255],所以在進行灰度變換時,通常使用查表法。
也就是,現將每個灰度值的映射后的結果計算出來,在變換時,通過查表得到變換后的灰度值。執行上面結果得到的結果如下:
左邊為原圖像,其拍攝環境較暗,無法分辨出很多的細節;右邊為變換后的圖像,整個圖像明亮許多,也能分辨出原圖中處于暗區域的狗狗的更多細節。
對數變換,還有一個很重要的性質,能夠壓縮圖像像素的動態范圍。例如,在進行傅立葉變換時,得到的頻譜的動態范圍較大,頻譜值的范圍通常為[0,106],甚至更高。
這樣范圍的值,顯示器是無法完整的顯示如此大范圍的灰度值的,因而許多灰度細節會被丟失掉。而將得到的頻譜值進行對數變換,可以將其動態范圍變換到一個合適區間,這樣就能夠顯示更多的細節。
冪律變換(伽馬變換)
伽馬變換的公式為:
其中c和γ為正常數。
伽馬變換的效果與對數變換有點類似,當γ>1時將較窄范圍的低灰度值映射為較寬范圍的灰度值,同時將較寬范圍的高灰度值映射為較窄范圍的灰度值;當γ<1時,情況相反,與反對數變換類似。
其函數曲線如下:
當γ<1時,γ的值越小,對圖像低灰度值的擴展越明顯;當γ>1時,γ的值越大,對圖像高灰度值部分的擴展越明顯。這樣就能夠顯示更多的圖像的低灰度或者高灰度細節。
伽馬變換主要用于圖像的校正,對灰度值過高(圖像過亮)或者過低(圖像過暗)的圖像進行修正,增加圖像的對比度,從而改善圖像的顯示效果。
基于 OpenCV 的實現:
floatpixels[256]; for(inti=0;i256;?i++) ????????pixels[i]?=?i?*?i?*i; ????Mat?imageLog(image.size(),?CV_32FC3); ????for?(int?i?=?0;?i(i,j)[0]=pixels[image.at (i,j)[0]]; imageLog.at (i,j)[1]=pixels[image.at (i,j)[1]]; imageLog.at (i,j)[2]=pixels[image.at (i,j)[2]]; } } //歸一化到0~255 normalize(imageLog,imageLog,0,255,CV_MINMAX); //轉換成8bit圖像顯示 convertScaleAbs(imageLog,imageLog);
這里選擇的參數為c = 1,γ=3,來擴展圖像的高灰度區域,其結果如下:
當選擇參數為c = 1,γ=0.4,來擴展圖像的低灰度區域,其效果如下:
根據以上的結果,結合伽馬變換的函數曲線圖,做如下總結:
γ>1時,會將低于某個灰度值K的灰度區域壓縮到較小的灰度區間,而將高于K的灰度區域擴展到較大灰度區間。
令L為灰度的最大值,k = 3/4L . 那么就有[0,3/4L]的灰度區域映射到為[0,1/8L]的輸出;而將[3/4L,L]這部分高灰度區域映射到[1/8L,L]區間。
這樣變換的結果就是,低于K的灰度區域被壓縮到更低灰度區間,而較亮的高灰度區域的灰度值被擴展到較大的灰度區間變的不那么亮,整體的效果就是圖像的對比度增加了,但是由于亮度區域被擴展,也就不那么亮了。
γ<1時,會將灰度值較小的低灰度區域擴展到較寬的灰度區間,而將較寬的高灰度區域壓縮到較小的灰度區間。
這樣變換的效果就是,低灰度區域擴展開來,變亮;而寬的高灰度區域,被壓縮的較窄的區間,也變亮了,故變換后的整體效果是變亮了。
基于OpenCV的灰度變換實現
灰度變換屬于點對點的一一變換,在實現的時候,可以利用查表法。也就是實現將[0,255]區間的各個灰度值的變換后的值計算出來,在變換的時候直接根據灰度值進行查表得到變換后的結果。
其實現如下:
///////////////////////////////////////////////////////////////////// // //灰度線性變換函數 //參數: //src,輸入原圖像 //dst,輸出圖像,類型為CV_32F,大小及通道數與原圖像相同 //mapping,灰度映射表,可以根據不同的變換函數,提前計算好圖像的灰度映射表 // //////////////////////////////////////////////////////////////////// voidgray_trans(constMat&src,Mat&dst,float*mapping) { intchannels=src.channels(); if(channels==1) { dst=Mat(src.size(),CV_32FC1); for(inti=0;i(i); constuchar*p2=src.ptr(i); for(intj=0;j(i); constuchar*p2=src.ptr (i); for(intj=0;j
其調用也比較簡單,根據具體的灰度變換函數,填充灰度映射表即可,以伽馬變換為例:
floatpixels[256]; for(inti=0;i256;?i++) ????????pixels[i]?=?powf(i,?1.5); ????Mat?imageLog; ????gray_trans(image,?imageLog,?pixels);
總結
本文主要對圖像的幾種常見的灰度變換進行了總結。
圖像反轉,是圖像線性變換的一種,可以得到圖像負片,能夠有效的增強圖像的暗色區域中的白色或者灰色細節
對數變換,擴展圖像中的低灰度區域,壓縮圖像中的高灰度區域,能夠增強圖像中的暗色區域的細節;反對數變換與此相反。對數變換還有個重要作用是,能夠壓縮圖像灰度值的動態范圍,在傅立葉變換中能夠顯示更多的變換后的頻譜細節。
伽馬變換,主要用于圖像的校正,根據參數γ的選擇不同,能夠修正圖像中灰度過高(γ>1)或者灰度過低(γ<1)
責任編輯:彭菁
-
圖像
+關注
關注
2文章
1083瀏覽量
40418 -
圖像處理技術
+關注
關注
0文章
33瀏覽量
10058 -
頻譜
+關注
關注
7文章
877瀏覽量
45581 -
函數
+關注
關注
3文章
4306瀏覽量
62431
原文標題:圖像處理基礎:圖像的灰度變換
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論