A. OpenCV C++(四)----對比度增強
對比度增強或者稱為對比度拉伸就是圖像增強技術的一種,它主要解決由於圖像的灰度級范圍較小造成的對比度較低的問題,目的就是將輸出圖像的灰度級放大到指定的程度,使得圖像中的細節看起來更加清晰。對比 度增強有幾種常用的方法,如線性變換、分段線性變換、伽馬變換、直方圖正規化、直方圖均衡化、局部自適應直方圖均衡化等。
灰度直方圖是圖像灰度級的函數, 用來描述每個灰度級在圖像矩陣中的像素個數或者佔有率(概率)。
OpenCV提供了函數 calcHist 來實現直方圖的構建,但是在計算8點陣圖的灰度直方圖 時,它使用起來略顯復雜。下面是OpenCV源碼
可以定義函數 calcGrayHist 來計算灰度直方圖,其中輸入參數為8點陣圖,將返回的灰度直方圖存儲為一個1行256列的 Mat 類型。
圖像對比度是通過灰度級范圍來度量的,而灰度級范圍可通過觀察灰度直方圖得到,灰度級范圍越大代表對比度越高;反之,對比度越低,低對比度的圖像在視覺上給人的感覺是看起來不夠清晰,所以通過演算法調整圖像的灰度值,從而調整圖像的對比度是有必要的。最簡單的一種對比度增強方法是通過灰度值的線性變換來實現的。
當a=1,b=0時,O為I的一個副本;如果a>1,則輸出圖像O的對 比度比I 有所增大;如果0<a< 1,則O的對比度比I有所減小。而b值的改變,影響的是輸出圖像的亮度,當b> 0時,亮度增加;當b<0時,亮度減小。
在OpenCV中實現一個常數與矩陣相乘有多種方式。
1、convertTo
註:當輸出矩陣的數據類型是 CV_8U 時, 大於255的值會自動截斷為255
2、矩陣乘法運算
使用乘法運算符「*」, 無論常數是什麼數據類型, 輸出矩陣的數據類型總是和輸入矩陣的數據類型相同,當數據類型是 CV_8U 時,在返回值中將大於255的值自動截斷為255。
3、convertScaleAbs
直方圖正規化是一種自動選取a和b的值的線性變換方法。
利用 minMaxLoc 函數不僅可以計算出矩陣中的最大值和最小值, 而且可以求出最大 值的位置和最小值的位置。 當然,
在使用過程中如果只想得到最大值和最小值, 則將其 他的變數值設為 NULL 即可。
OpenCV提供的函數: normalize()
使用函數 normalize 對圖像進行對比度增強時, 經常令參數 norm_type=NORM_MINMAX , 和直方圖正規化原理詳解中提到的計算方法是相同的, 參數 alpha 相當於 Omax , 參數 beta 相當於 Omin 。 注意, 使用 normalize 可以處理多通道矩陣, 分別對每一個通道進行正規化操作。
非線性變換 。
假設輸入圖像為I,寬為W、 高為H,首先將其灰度值歸一化到[0,1]范圍,對於8位 圖來說,除以255即可。 I (r, c) 代表歸一化後的第r行第c列的灰度值, 輸出圖像記為 O, 伽馬變換就是令 O(r, c) =I(r, c) γ , 0≤r<H, 0≤c< W,
當γ=1時, 圖像不變。 如果圖像整體或者感興趣區域較暗, 則令0< γ< 1可以 增加圖像對比度; 相反, 如果圖像整體或者感興趣區域較亮, 則令γ>1可以降低圖像對比度。
伽馬變換在提升對比度上有比較好的效果, 但是需要手動調節γ值。
全局直方圖均衡化操作是對圖像I進行改變, 使得輸出圖像O的灰度直方圖 hist O 是「平」的, 即每一個灰度級的像素點個數是「相等」的。 注意,其實這里的「相等」不是嚴格意義上的等於, 而是約等於,
上述分別為I和O的累加直方圖
總結,對於直方圖均衡化的實現主要分四個步驟:
OpenCV實現的直方圖均衡化函數 equalize-Hist , 其使用方法很簡單, 只支持對 8點陣圖 的處理。
雖然全局直方圖均衡化方法對提高對比度很有效,但是均衡化處理以後暗區域的雜訊可能會被放大,變得清晰可 見,而亮區域可能會損失信息。為了解決該問題, 提出了自適應直方圖均衡化(Aptive Histogram Equalization) 方法。
自適應直方圖均衡化首先將圖像劃分為不重疊的區域塊(tiles) ,然後對每一個塊分別進行直方圖均衡化。 顯然, 在沒有雜訊影響的情況下, 每一個小區域的灰度直方圖會被限制在一個小的灰度級范圍內; 但是如果有雜訊, 每一個分割的區域塊執行直方圖均衡化後, 雜訊會被放大。為了避免出現雜訊這種情況, 提出了「限制對比度」(Contrast Limiting) [3],如果直方圖的bin超過了提前預設好的「限制對比度」, 那麼會被裁減, 然 後將裁剪的部分均勻分布到其他的bin, 這樣就重構了直方圖。
OpenCV提供的函數 createCLAHE 構建指向 CLAHE 對象的指針, 其中默認設置「限制 對比度」為40,塊的大小為8×8。
B. GMM模型是什麼
就是用高斯概率密度函數(正態分布曲線)精確地量化事物,將一個事物分解為若乾的基於高斯概率密度函數(正態分布曲線)形成的模型。GMMs已經在數值逼近、語音識別、圖像分類、圖像去噪、圖像重構、故障診斷、視頻分析、郵件過濾、密度估計、目標識別與跟蹤等領域取得了良好的效果。
對圖像背景建立高斯模型的原理及過程:圖像灰度直方圖反映的是圖像中某個灰度值出現的頻次,也可以認為是圖像灰度概率密度的估計。如果圖像所包含的目標區域和背景區域相比比較大,且背景區域和目標區域在灰度上有一定的差異,那麼該圖像的灰度直方圖呈現雙峰-谷形狀。
主要步驟
1、為圖像的每個像素點指定一個初始的均值、標准差以及權重。
2、收集N(一般取200以上,否則很難得到像樣的結果)幀圖像利用在線EM演算法得到每個像素點的均值、標准差以及權重)。
3、從N+1幀開始檢測,檢測的方法:
對每個像素點:
1)將所有的高斯核按照ω/σ降序排序
2)選擇滿足公式的前M個高斯核:M= arg min(ω/σ>T)
3)如果當前像素點的像素值在中有一個滿足:就可以認為其為背景點。
C. 直方圖均衡化對有些圖片不能達到好的效果, 為什麼
我來說一下
首先直方圖均衡化的公式為sk對nj/n在j由0到k求和,正如樓主你所說,它所起到的作用是把原本分布不均的灰度直方圖在整個灰度級別內均勻分布。
呵呵,一定要抓住這一點,即均衡化是由公式實現的,你想一想,對於一幅很暗的圖片,既是它的灰度直方圖全都集中在低灰度區,即比如灰度值由0-255,灰度值是2,3,5等的低灰度的頻數就會很大,即它們的頻率好高,因為這幅畫很暗。好,現在咱們把這幅畫均衡化,看那個公式的定義,根據公式得來的數據,即均衡化後的直方圖中,低灰度區,比如5這一灰度級所對應的頻數是不是很大,因為現在的是把原圖中低灰度區,即正如上面所假設的2,3,5這些頻率很大的灰度級相加而得,當然加後所得更大,即在均衡化後,僅5這一點得頻數就已經很高,即頻數很大,即灰度級很大,可想而知,越往後加,灰度級都很大,對應的,灰度級大了,當然直方圖就集中在高灰度區,相應的圖像就發白或很亮。特別亮的也是一個道理。
對於這種情況,應該用直方圖規定化(匹配)來處理。
對於馬賽克,很簡單,你想想,先畫一個8*8格,拿不同深度的鉛筆,比如H,2H,B,2B之類的,你想在只拿一種深度的把四個格都塗滿,是不是黑乎乎一片,然後拿兩種筆塗,是不是有了區別。你用的鉛筆深度種類越多,整個格所構成的圖畫細節越明顯。同理,當你把很暗的圖均衡化後,灰度級別都集中在高灰度區,就相當於筆的種類很少來畫這幅畫,當然也有馬賽克。
給你截的圖是均衡化後的,你仔細想想.
呵呵
D. photoshop 怎麼實現直方圖均衡化
圖形處理中有一種對比度變換,像顯示器就有對比度調節,PhotoShop也有圖片的對比度修改,對比度的提高可以使圖像細節清晰,相反,對比度的減小可以隱藏圖像的細節,在一定程度上使圖像柔和。
對比度變換其中一種比較簡單的方法是直方圖均衡化。
所謂直方圖就是在某一灰度級的象素個數占整幅圖像的象素比 h=nj/N,其中nj是灰度級在j的象素數,N是總象素數,掃描整幅圖像得出的h的離散序列就是圖像的直方圖,h求和必然=1,所以直方圖可以看成是象素對於灰度的概率分布函數。
直方圖是高低不齊的,因為象素灰度是隨機變化的,直方圖均衡化就是用一定的演算法使直方圖大致平和。
演算法如下:
對於一個直方圖
設 Pr(r)是原始圖像直方圖,Ps(s)是均衡化的直方圖,
由於其是一個概率分布函數
所以有 Ps(s)ds=Pr(r)dr (編輯關系,ds,dr是積分變數)
因為要進行均衡化,令 Ps(s)=1,
得 ds=Pr(r)dr/1
兩邊積分得 s=F Pr(r)dr (因為編輯關系,左邊F表示積分符號....-__-++)
數字圖像是離散的,因此離散化上式得
sk=E{j=0,k}(nj/N) 左式k,j是離散量下標,因為編輯關系,E{0,k}表示下標0到k的連加符號,N是象素總數
由此得出每一象素的sk為均衡化後的正規化灰度(即灰度正規化到[0,1]),統計sk即可得出均衡化後的直方圖。
在均衡化過程中可以對每一象素映射到新的實際灰度值sk*255,就實現了圖像的變換
(嚴格理論中應該是灰度正規化到[0,1]區間,然後均衡化後的sk還要量化到原始的正規灰度以實現灰度合並,下面的BCB程序並沒有量化,而且255是固定灰度級,因為256色BMP的彩色表就是256個表項)
現在開始實踐
用BCB對一BMP灰度圖像進行直方圖均衡化處理,代碼如下
//----------------------------BCB6代碼
#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include "Unit1.h"
#include"File1.h"
#pragma pack(1)
//BMP文件頭
struct BITMAPFILEHEADER_
{
short type;
int bfSize;
short re1,re2;
int Offbits;
};
//BMP信息頭
struct BITMAPINFO_
{
long size;
long width,height;
short planes,bitCount;
long comp,sizeImg;
long xpels,ypels;
long used,important;
};
//BMP彩色表項
struct COLOR_
{
char blue,green,red,re;
};
//------將BMP彩色表的數據校正到BCB TColor的數據。
void SwitchColor(long &c)
{
long blue=c& 0x000000ff;
long green=c& 0x0000ff00;
long red=c& 0x00ff0000;
c=(blue<<16) | green | (red>>16);
}
void xxx()
{
FILE *f=fopen("f:\\bbs_prev2.bmp","rb");
if(f==NULL) /*判斷文件是否打開成功*/
{
ShowMessage("File open error");
return;
}
fseek(f,0,0);//移動到開頭
//----------讀BMP文件頭
BITMAPFILEHEADER_ *bmph=new BITMAPFILEHEADER_();
if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1,f)==NULL)
{
ShowMessage("File read error");
return;
}
//-----------讀BMP信息頭
BITMAPINFO_ *bmpi=new BITMAPINFO_();
if(fread((char*)bmpi,sizeof(BITMAPINFO_),1,f)==NULL)
{
ShowMessage("File read error2");
return;
}
//--------------讀彩色表
long *c=new long[bmph->Offbits-sizeof(BITMAPFILEHEADER_)-sizeof(BITMAPINFO_)];
fread((char*)c,bmph->Offbits-sizeof(BITMAPFILEHEADER_)-sizeof(BITMAPINFO_),1,f);
//----------顯示一些信息
Form1->Edit1->Text=IntToStr(bmph->bfSize);
Form1->Edit2->Text=IntToStr(bmpi->width);
Form1->Edit3->Text=IntToStr(bmpi->height);
Form1->Edit4->Text=IntToStr(bmpi->comp);
Form1->Edit5->Text=IntToStr(bmpi->used);
int i,j,k,wc;
long N=bmph->bfSize- bmph->Offbits;//象素總數
unsigned char *image=new char[N]; //點陣圖矩陣
unsigned char *newimage=new char[N];//變換後的點陣圖矩陣
fread(image,N,1,f);//讀入點陣圖矩陣
//---------直方圖數列初始化
//---------直方圖數列用來存儲正規化後的灰度
double *h=new double[255];//255個灰度級,保存原始圖像正規化灰度直方圖數據
for(i=0;i<255;i++)
h[i]=0.0;
double *nh=new double[255];//255個灰度級,保存變換後的圖像正規化灰度直方圖
for(i=0;i<255;i++)
nh[i]=0.0;
long *count=new long[255]; //每一灰度級的象素數量統計
for(i=0;i<255;i++)
count[i]=0;
for(i=0;i<N;i++)
{
count[image[i]]++;
}
//-----正規化灰度概率統計
for(i=0;i<255;i++)
{
h[i]=count[i]/(double)N;
}
//------正規化新灰度圖
double hc;
for(i=0;i<N;i++)
{
hc=0;
for(j=0;j<image[i];j++)
hc+=h[j];
nh[image[i]]+=hc; //保存新正規化灰度圖
newimage[i]=hc*255; //保存新圖像灰度索引
}
//----------顯示直方圖
for(i=0;i<255;i++)
{
//原始直方圖
Form1->Canvas->MoveTo(10+i,200);
Form1->Canvas->LineTo(10+i,200+h[i]*N);
//新直方圖
Form1->Canvas->MoveTo(300+i,200);
Form1->Canvas->LineTo(300+i,200+nh[i]*255);
}
//------顯示圖形
TColor *tc;
if(bmpi->width%4==0)//-----------因為BMP圖像4位元組對齊
wc=bmpi->width/4*4;
else
wc=(bmpi->width/4+1)*4;
long a;
long pos=0;
for( i=0;i<bmpi->height;i++)
{
for(j=0;j<wc;j++)
{
//-----原始圖形
a= c[image[pos]];
SwitchColor(a);
Form1->Canvas->Pixels[10+j][600-i]=a;
//------新圖形
a= c[newimage[pos]];
SwitchColor(a);
Form1->Canvas->Pixels[300+j][600-i]=a;
pos++;
}
}
fclose(f);
}
這個程序使用256色BMP文件,但程序代碼是針對灰度圖像的,用於彩色圖像時得出一些古怪色彩配合而已。
在對灰度圖像均衡化時
如果原始圖像對比度本來就很高,如果再均衡化則灰度調和,對比度降低。
在泛白緩和的圖像中,由於均衡化過程中會合並一些象素灰度,則會增大對比度,這里255灰度級太多,合並不明顯。
http://hi..com/j_fo/blog/item/09a6adc3f8078855b319a8ac.html
還有詳細的說明和圖解
E. 直方圖均衡化處理的主要步驟是什麼
設原始圖像在(x,y)處的灰度為f,而改變後的圖像為g,則對圖像增強的方法可表述為將在(x,y)處的灰度f映射為g。
在灰度直方圖均衡化處理中對圖像的映射函數可定義為:g = EQ (f)。
這個映射函數EQ(f)必須滿足兩個條件(其中L為圖像的灰度級數):
(1)EQ(f)在0≤f≤L-1范圍內是一個單值單增函數。這是為了保證增強處理沒有打亂原始圖像的灰度排列次序,原圖各灰度級在變換後仍保持從黑到白(或從白到黑)的排列。
(2)對於0≤f≤L-1有0≤g≤L-1,這個條件保證了變換前後灰度值動態范圍的一致性。
(5)灰度直方圖演算法擴展閱讀:
直方圖均衡化作用
這種方法通常用來增加許多圖像的全局對比度,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分布。
這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。
這種方法對於背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來X光圖像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。
這種方法的一個主要優勢是它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢復原始的直方圖,並且計算量也不大。這種方法的一個缺點是它對處理的數據不加選擇,它可能會增加背景雜訊的對比度並且降低有用信號的對比度。
在統計學中,直方圖(英語:Histogram)是一種對數據分布情況的圖形表示,是一種二維統計圖表,它的兩個坐標分別是統計樣本和該樣本對應的某個屬性的度量。直方圖是品質管理七大工具之一。
把直方圖上每個屬性的計數除以所有屬性的計數之和,就得到了歸一化直方圖。之所以叫「歸一」,是因為歸一化直方圖的所有屬性的計數之和為1,也就是說,每個屬性對應計數都是0到1之間的一個數(百分比)。
參考資料來源:網路-直方圖均衡化
F. 灰度值是什麼是怎麼測量的
灰度值是指將灰度對象轉換為 RGB 時,每個對象的顏色值。把白色與黑色之間按對數關系分成若干級,稱為「灰度等級」,使用黑白或灰度掃描儀測量生成的圖像通常以灰度顯示。
在計算機領域中,灰度(Gray scale)數字圖像是每個像素只有一個采樣顏色的圖像。這類圖像通常顯示為從最暗黑色到最亮的白色的灰度,盡管理論上這個采樣可以任何顏色的不同深淺,甚至可以是不同亮度上的不同顏色。
灰度圖像與黑白圖像不同,在計算機圖像領域中黑白圖像只有黑白兩種顏色,灰度圖像在黑色與白色之間還有許多級的顏色深度。但是,在數字圖像領域之外,「黑白圖像」也表示「灰度圖像」,例如灰度的照片通常叫做「黑白照片」。
在一些關於數字圖像的文章中單色圖像等同於灰度圖像,在另外一些文章中又等同於黑白圖像。灰度使用黑色調表示物體,即用黑色為基準色,不同的飽和度的黑色來顯示圖像。
每個灰度對象都具有從 0%(白色)到100%(黑色)的亮度值。 使用黑白或灰度掃描儀生成的圖像通常以灰度顯示。
(6)灰度直方圖演算法擴展閱讀
灰度等級范圍一般從0到255,白色為255,黑色為0,故黑白圖片也稱灰度圖像,在醫學、圖像識別領域有很廣泛的用途。
灰度分布是指灰度圖像的灰度值的分布情況,反映了圖像的最基本的統計特徵。灰度分布主要應用於圖像分割中,通過對灰度圖像的灰度分布的理解,來分析圖像一些性質。
灰度直方圖是關於灰度級分布的函數,是對圖像中灰度級分布的統計。灰度直方圖是將數字圖像中的所有像素,按照灰度值的大小,統計其出現的頻率。灰度直方圖是灰度級的函數,它表示圖像中具有某種灰度級的像素的個數,反映了圖像中某種灰度出現的頻率。
如果將圖像總像素亮度(灰度級別)看成是一個隨機變數,則其分布情況就反映了圖像的統計特性,這可用probability density function (PDF)來刻畫和描述,表現為灰度直方圖。可以通過直方圖的狀態來評斷圖像的一些性質,明亮圖像的直方圖傾向於灰度級高的一側;
低對比度圖像的直方圖窄而集中於灰度級的中部,高對比度圖像的直方圖成分覆蓋的灰度級很寬而且像素的分布沒有不太均勻,只有少量的垂線比其他高許多。
直觀上來說:若一幅圖像其像素佔有全部可能的灰度級並且分布均勻,則這樣的圖像有高對比度和多變的灰度色調。
從概率的觀點來理解,灰度出現的頻率可看作其出現的概率,這樣直方圖就對應於概率密度函數(probabilitydensityfunction),而概率分布函數就是直方圖的累積和,即概率密度函數的積分。