圖像預(yù)處理主要包括去噪、對比度增強,去噪和對比度增強方法順序不唯一,根據(jù)實際情況作出最好的安排。
1、灰度化
http://blog.sina.com.cn/s/blog_13c6397540102wqtt.html
那么什么叫圖片的灰度化呢?其實很簡單,就是讓像素點矩陣中的每一個像素點都滿足下面的關(guān)系:R=G=B(就是紅色變量的值,綠色變量的值,和藍色變量的值,這三個值相等,“=”的意思不是程序語言中的賦值,是數(shù)學(xué)中的相等),此時的這個值叫做灰度值。
灰度處理的方法:
???一般灰度處理經(jīng)常使用兩種方法來進行處理。
?方法1:
?????灰度化后的R=(處理前的R + 處理前的G +處理前的B)/ 3
????灰度化后的G=(處理前的R + 處理前的G +處理前的B)/ 3
?????灰度化后的B=(處理前的R + 處理前的G +處理前的B)/ 3
方法2:
?????灰度化后的R =處理前的R * 0.3+ 處理前的G * 0.59 +處理前的B * 0.11
?????灰度化后的G =處理前的R * 0.3+ 處理前的G * 0.59 +處理前的B * 0.11
?????灰度化后的B =處理前的R * 0.3+ 處理前的G * 0.59 +處理前的B * 0.11
2、高斯濾波、均值濾波、中值濾波、雙邊濾波(去噪)
https://blog.csdn.net/u013007900/article/details/78181249
高斯濾波器是一種線性濾波器,能夠有效的抑制噪聲,平滑圖像。其作用原理和均值濾波器類似,都是取濾波器窗口內(nèi)的像素的均值作為輸出。其窗口模板的系數(shù)和均值濾波器不同,均值濾波器的模板系數(shù)都是相同的為1;而高斯濾波器的模板系數(shù),則隨著距離模板中心的增大而系數(shù)減小。所以,高斯濾波器相比于均值濾波器對圖像個模糊程度較小。
均值濾波及中值濾波的區(qū)別
均值濾波和和中值濾波都可以起到平滑圖像,慮去噪聲的功能。均值濾波采用線性的方法,平均整個窗口范圍內(nèi)的像素值,均值濾波本身存在著固有的缺陷,即它不能很好地保護圖像細節(jié),在圖像去噪的同時也破壞了圖像的細節(jié)部分,從而使圖像變得模糊,不能很好地去除噪聲點。均值濾波對高斯噪聲表現(xiàn)較好,對椒鹽噪聲表現(xiàn)較差。中值濾波采用非線性的方法,它在平滑脈沖噪聲方面非常有效,同時它可以保護圖像尖銳的邊緣,選擇適當(dāng)?shù)狞c來替代污染點的值,所以處理效果好,對椒鹽噪聲表現(xiàn)較好,對高斯噪聲表現(xiàn)較差。
http://www.360doc.com/document/18/0320/20/52973095_738813007.shtml
https://www.cnblogs.com/qiqibaby/p/5281743.html
雙邊濾波:
雙邊濾波是一種非線性濾波器,它可以達到保持邊緣、降噪平滑的效果。和其他濾波原理一樣,雙邊濾波也是采用加權(quán)平均的方法,用周邊像素亮度值的加權(quán)平均代表某個像素的強度,所用的加權(quán)平均基于高斯分布[1]。最重要的是,雙邊濾波的權(quán)重不僅考慮了像素的歐氏距離(如普通的高斯低通濾波,只考慮了位置對中心像素的影響),還考慮了像素范圍域中的輻射差異(例如卷積核中像素與中心像素之間相似程度、顏色強度,深度距離等),在計算中心像素的時候同時考慮這兩個權(quán)重。 公式1a,1b給出了雙邊濾過的操作,Iq為輸入圖像,Ipbf為濾波后圖像:


雙邊濾波的核函數(shù)是空間域核與像素范圍域核的綜合結(jié)果:在圖像的平坦區(qū)域,像素值變化很小,對應(yīng)的像素范圍域權(quán)重接近于1,此時空間域權(quán)重起主要作用,相當(dāng)于進行高斯模糊;在圖像的邊緣區(qū)域,像素值變化很大,像素范圍域權(quán)重變大,從而保持了邊緣的信息。
(雙邊濾波算法)原理及實現(xiàn):
https://blog.csdn.net/piaoxuezhong/article/details/78302920
3、gamma矯正
https://blog.csdn.net/w450468524/article/details/51649651
https://www.cnblogs.com/qiqibaby/p/5325193.html
(Gamma?Correction,伽瑪校正):所謂伽瑪校正就是對圖像的伽瑪曲線進行編輯,以對圖像進行非線性色調(diào)編輯的方法,檢出圖像信號中的深色部分和淺色部分,并使兩者比例增大,從而提高圖像對比度效果。計算機繪圖領(lǐng)域慣以此屏幕輸出電壓與對應(yīng)亮度的轉(zhuǎn)換關(guān)系曲線,稱為伽瑪曲線(Gamma?Curve)。
以傳統(tǒng)CRT(Cathode?Ray?Tube)屏幕的特性而言,該曲線通常是一個乘冪函數(shù),Y=(X+e)γ,其中,Y為亮度、X為輸出電壓、e為補償系數(shù)、乘冪值(γ)為伽瑪值,改變乘冪?值(γ)的大小,就能改變CRT的伽瑪曲線。典型的Gamma值是0.45,它會使CRT的影像亮度呈現(xiàn)線性。使用CRT的電視機等顯示器屏幕,由于對于?輸入信號的發(fā)光灰度,不是線性函數(shù),而是指數(shù)函數(shù),因此必需校正


4、直方圖均衡化
直方圖均衡化(Histogram Equalization)?又稱直方圖平坦化,實質(zhì)上是對圖像進行非線性拉伸,重新分配圖像象元值,使一定灰度范圍內(nèi)象元值的數(shù)量大致相等。這樣,原來直方圖中間的峰頂部分對比度得到增強,而兩側(cè)的谷底部分對比度降低,輸出圖像的直方圖是一個較平的分段直方圖:如果輸出數(shù)據(jù)分段值較小的話,會產(chǎn)生粗略分類的視覺效果。
?直方圖是表示數(shù)字圖像中每一灰度出現(xiàn)頻率的統(tǒng)計關(guān)系。直方圖能給出圖像灰度范圍、每個灰度的頻度和灰度的分布、整幅圖像的平均明暗和對比度等概貌性描述?;叶戎狈綀D是灰度級的函數(shù),?反映的是圖像中具有該灰度級像素的個數(shù),?其橫坐標(biāo)是灰度級r,?縱坐標(biāo)是該灰度級出現(xiàn)的頻率(?即像素的個數(shù)) pr( r) ,?整個坐標(biāo)系描述的是圖像灰度級的分布情況,?由此可以看出圖像的灰度分布特性,?即若大部分像素集中在低灰度區(qū)域,?圖像呈現(xiàn)暗的特性;?若像素集中在高灰度區(qū)域,?圖像呈現(xiàn)亮的特性。
?圖1所示就是直方圖均衡化,?即將隨機分布的圖像直方圖修改成均勻分布的直方圖。基本思想是對原始圖像的像素灰度做某種映射變換,?使變換后圖像灰度的概率密度呈均勻分布。這就意味著圖像灰度的動態(tài)范圍得到了增加,?提高了圖像的對比度。

①求該圖像的灰度直方圖。②對該圖像進行直方圖均衡化處理,寫出過程和結(jié)果。
首先需要說明的是,如果你說的是一道完整的題目,則這道題目沒有唯一解,因為題目中沒有說明原始圖像的灰度級數(shù)(比如原始圖像是16個灰度級的,或者是32個灰度級的,等等)。為了給你提供一個解題思路,現(xiàn)在人為假設(shè)原始圖像是16個灰度級的,其它灰度級的解法類似。
圖像的灰度直方圖求法為:
先計算圖像中各個灰度級的出現(xiàn)頻率,用h(i)表示灰度級i的出現(xiàn)頻率,其值等于灰度級出現(xiàn)次數(shù)/圖像像素個數(shù):
h(0)=2/16,h(1)=1/16,h(2)=3/16,h(3)=2/16,h(4)=0/16
h(5)=1/16,h(6)=4/16,h(7)=1/16,h(8)=1/16,h(9)=1/16
h(10)=h(11)=h(12)=h(13)=h(14)=h(15)=0/16。
圖像進行直方圖均衡化處理的過程為:
先計算累積分布,用r(i)表示灰度級i的累積分布:
r(0)=h(0)=2/16
r(1)=r(0)+h(1)=2/16+1/16=3/16
r(2)=r(1)+h(2)=3/16+3/16=6/16
r(3)=r(2)+h(3)=6/16+2/16=8/16
r(4)=r(3)+h(4)=8/16+0/16=8/16
r(5)=r(4)+h(5)=8/16+1/16=9/16
r(6)=r(5)+h(6)=9/16+4/16=13/16
r(7)=r(6)+h(7)=13/16+1/16=14/16
r(8)=r(7)+h(8)=14/16+1/16=15/16
r(9)=r(8)+h(9)=15/16+1/16=16/16=1
r(10)=r(11)=r(12)=r(13)=r(14)=r(15)=1
將累積分布進行量化(量化時需要用到原始圖像的灰度級數(shù),這也是為什么前面需要說明的原因),量化后的灰度級用rq(i)表示,量化公式為rq(i)=ROUND(r(i)*15),(說明:量化公式中的15等于原始圖像灰度級數(shù)減1),可得:
rq(0)=ROUND(r(0)*15)=2
rq(1)=ROUND(r(1)*15)=3
rq(2)=ROUND(r(2)*15)=6
rq(3)=ROUND(r(3)*15)=8
rq(4)=ROUND(r(4)*15)=8
rq(5)=ROUND(r(5)*15)=8
rq(6)=ROUND(r(6)*15)=12
rq(7)=ROUND(r(7)*15)=13
rq(8)=ROUND(r(8)*15)=14
rq(9)=ROUND(r(9)*15)=15
rq(10)=ROUND(r(10)*15)=15
rq(11)=ROUND(r(11)*15)=15
rq(12)=ROUND(r(12)*15)=15
rq(13)=ROUND(r(13)*15)=15
rq(14)=ROUND(r(14)*15)=15
rq(15)=ROUND(r(15)*15)=15
因此,原始圖像中的灰度級和均化后圖像中的灰度級之間的對應(yīng)關(guān)系為:
0->2??1->3?? 2->6?? 3->8??4->8?? 5->8?? 6->12??7->13?? 8->14?? 9->15
10->15?11->15?? 12->15?? 13->15?14->15?? 15->15
#include
#include
#include
usingnamespacestd;
intmain(intargc,char** argv)
{
//載入圖片
inti=0, j=0, temp=0;
IplImage * img = cvLoadImage("D:\\2.jpg", CV_LOAD_IMAGE_GRAYSCALE);//圖片路徑
intheight = img->height;
intwidth? = img->width;
intstep? = img->widthStep;
uchar *data = (uchar*)img->imageData;
floatsize = height*width;
//直方圖
unsignedinthist[256] = {0};
for(i=0; i
{
for(j=0; j
{
temp = data[i*step+j];
hist[temp]++;
}
}
//歸一化直方圖
floathistPDF[256] = {0};
for(i=0; i<255; i++)
{
histPDF[i]=(float)hist[i]/size;
}
//累積直方圖
floathistCDF[256] = {0};
for(i=0; i<256; i++)
{
if(0==i) histCDF[i] = histPDF[i];
elsehistCDF[i] = histCDF[i-1] + histPDF[i];
}
//直方圖均衡化,映射
inthistEQU[256] = {0};
for(i=0; i<256; i++)
{
histEQU[i] = (int)(255.0* histCDF[i] +0.5);
}
for(i=0; i
{
for(j=0; j
{
temp = data[i*step+j];
data[i*step+j] = histEQU[temp];
}
}
cvNamedWindow("demo", CV_WINDOW_AUTOSIZE);
cvShowImage("demo", img);
cvWaitKey(0);
cvDestroyWindow("demo");
cvReleaseImage(&img);
return0;
}
5、線性變換
y=a*x+b的方式,其中x表示原圖,y表示輸出圖像。
a=1,b=0,y和x相同
a>1對比度增強,a<1對比度減弱
b>0亮度增強,b<0亮度減弱
6、亮度、飽和度調(diào)整
https://blog.csdn.net/mao0514/article/details/47041099
通常在RGB色彩空間調(diào)整亮度與飽和度不是很直觀,而HSL彩色空可以很直觀表示出
每個像素的飽和度與亮度。所以首先讀取圖像的像素RGB值然后再轉(zhuǎn)換到HSL空間得
到飽和度與亮度值,調(diào)整以后再從HSL空間轉(zhuǎn)換到RGB空間的RGB值,對每個像素完
成這樣的調(diào)整就完成圖像的亮度與飽和度調(diào)整。
關(guān)于RGB與HSL色彩空間的轉(zhuǎn)換
代碼:http://lib.csdn.net/article/css3/52059

轉(zhuǎn)換公式:

7、一種計算圖像曝光度(Exposure)的方法
https://blog.csdn.net/grafx/article/details/45619731
下面是基于opencv的相關(guān)代碼示例,strength范圍可以設(shè)置為-2.0到2.0:
// strength范圍[-2.0, 2.0]
int row = inputImg.rows;
int step = inputImg.step;
uchar* pInputImg = inputImg.data;
uchar* pOutputImg = outputImg.data;
for (int i = 0; i < row * step; i++)
{
pOutputImg[i] = (uchar)min_uchar(255, max_uchar(0, pInputImg[i] * pow(2, strength)));
}