OPENCV直方圖操作

2022-11-11 18:06:03 字數 3899 閱讀 9195

直方圖cvhistogram

typedefstructcvhistogram

cvhistogram;

type:用來指定第二個成員bins的型別。opencv中常見到cvarr*的介面,可以用以指定諸如cvmat、cvma***、iplimage的型別,其實cvarr*的是乙個指向void的指標。

在函式內部有時需要得到確切的指向型別,這就需要type來指定。

bins:存放每個灰度級數目的陣列指標。

thresh:用來指定統計直方圖分布的上下界。比如[0255]表示用來統計影象中畫素分別在灰度級[0255]區間的分布情況,cv_max_dim對應直方圖的維數,假如設定二維紅-藍直方圖的thresh為[0255;100200],就是分別統計紅色影象灰度級在[0255]以及藍色影象在灰度級[100200]的分布情況。

thresh用以指定均勻直方圖的分布,如果統計畫素在2個區間的分布,則對應[0255]的上下界,均勻分布統計的區間即[0127][127255]分布的概率,這也是為什麼thresh第二個維數預設為2——會自動均分上下界;

thresh2:指定非均勻的分布,這就需要指定每個區間的上下界,如果要統計直方圖在區間(0,的分布,那需要指定thresh2的乙個維度為[010100255],所以用float**10,100,255)形式表示。

mat:簡單說就是儲存了直方圖的資訊,即我們統計的直方圖分布概率。

建立直方圖cvcreatehist()

opencv中用cvcreatehist()建立乙個直方圖:cvhistogram*cvcreatehist(

intdims,//直方圖維數

int*sizes,//直方圖維數尺寸inttype,//直方圖的表示格式

float**ranges=null,//圖中方塊範圍的陣列

intuniform=1//歸一化標識,原理有點複雜。通常使用預設值即可。);

dims:直方圖維數,灰度圖為1,彩色圖為3。

sizes:陣列的長度為dims,每個數表示分配給對應維數的bin的個數。如dims=3,則size中用[s1,s2,s3]分別指定每維bin的個數。

type:兩種:cv_hist_array意味著直方圖資料表示為多維密集陣列cvma***;cv_hist_tree意味著直方圖資料表示為多維稀疏陣列cvsparsemat。

ranges:thresh的範圍,內容取決於uniform的值。uniform為0是均勻的,非0時不

均勻。計算影象直方圖calchist()

voidcvcalchist(

iplimage**image,//輸入影象(也可用cvmat**)cvhistogram*hist,//輸出直方圖指標

intaccumulate=0,//累計標識,如果設定,則直方圖在開始時不被清零。

constcvarr*mask=null//操作mask,確定輸入影象的哪個象素被計數。這個特徵

保證可以為多個影象計算乙個單獨的直方圖,或者**更新直方圖。

);這是個inline函式,函式內部會直接呼叫cvcalcarrhist((cvarr**)image,hist,accumulate,mask);

示例**:intmain();//灰度級的範圍float*ranges=;

//建立一維直方圖,統計影象在[0255]畫素的均勻分布

cvhistogram*gray_hist=cvcreatehist(1,&hist_size,cv_hist_array,ranges,1);//計算灰度影象的一維直方圖

cvcalchist(&gray_plane,gray_hist,0,0);//歸一化直方圖

cvnormalizehist(gray_hist,1.0);intscale=2;

,橫座標為灰度級,縱座標為畫素個數(*scale)//建立一張一維直方圖的「圖」

iplimage*hist_image=cvcreateimage(cvsize(hist_size*scale,hist_height),8,3);cvzero(hist_image);

//統計直方圖中的最大直方塊floatmax_value=0;

cvgetminmaxhistvalue(gray_hist,0,&max_value,0,0);//分別將每個直方塊的值繪製到圖中for(inti=0;ifloatbin_val=cvqueryhistvalue_1d(gray_hist,i);//畫素i的概率

intintensity=cvround(bin_val*hist_height/max_value);cvrectangle(hist_image,

cvpoint(i*scale,hist_height-1),

cvpoint((i+1)*scale-1,hist_height-intensity),cv_rgb(255,255,255));}

cvnamedwindow("graysource",1);cvshowimage("graysource",gray_plane);cvnamedwindow("h-shistogram",1);

cvshowimage("h-shistogram",hist_image);cvwaitkey(0);}

//要繪製的高度

直方圖均衡化cvequalizehist()

函式功能:直方圖均衡化,該函式能歸一化影象亮度和增強對比度。

cvapi(void)cvequalizehist(constcvarr*src,cvarr*dst);第乙個引數表示輸入影象,必須為灰度圖(8位,單通道圖)。第二個引數表示輸出影象函式說明:

該函式採用如下法則對輸入影象進行直方圖均衡化:

1:計算輸入影象的直方圖h。

2:直方圖歸一化,因此直方塊和為255。

3:計算直方圖積分,h'(i)=sum(h(j))(0<=j<=i)。

4:採用h'作為查詢表:dst(x,y)=h'(src(x,y))進行影象變換。cvsplit

函式功能:分割多通道數組成幾個單通道陣列或者從陣列中提取乙個通道。函式原型:

cvapi(void)cvsplit(constcvarr*src,cvarr*dst0,cvarr*dst1,cvarr*dst2,cvarr*dst3);引數說明:

第乙個引數表示輸入的多通道陣列即輸入影象。

第二,三,四,五個引數分別表示輸出的單通道陣列。cvmerge

函式功能:分割多通道數組成幾個單通道陣列或者從陣列中提取乙個通道。函式原型:

cvapi(void)cvmerge(constcvarr*src0,constcvarr*src1,constcvarr*src2,constcvarr*src3,cvarr*dst);引數說明:

第一,二,三,四個引數表示輸入的單通道陣列。

第五個引數分別表示合併後的多通道陣列即輸出影象。示例**:

#include<>#include<>

intmain(intargc,char**ar**);

iplimage*dst=cvcreateimage(cvgetsize(src),ipl_depth_8u,3);

if(src)

//要求單通

//通道分離

cvsplit(src,imgchannel[0],imgchannel[1],imgchannel[2],imgchannel[3]);//bgrafor(i=0;inchannels;i++)

//通道組合

cvmerge(imgchannel[0],imgchannel[1],imgchannel[2],imgchannel[3],dst);cvnamedwindow("src",1);

cvshowimage("src",src);

cvnamedwindow("equalize",1);cvshowimage("equalize",dst);cvwaitkey(0);

//釋放資源

for(i=0;inchannels;i++)

cvreleaseimage(&dst);}

return0;}

如何看懂直方圖

隨著數位相機 以下簡稱dc 影象處理技術的不斷發展,越來越多的相機內建了直方圖的功能。雖然直方圖對初學者來說,還很陌生。但它卻早已存在於我們的生活 工作中。如在著名的影象處理軟體photoshop裡面,對應直方圖的命令就是histogram 中文版為 直方圖 直方圖的含義 在一張 的直方圖中,橫軸代...

10 2 1直方圖及反思

10.1.2直方圖 1 學習目標 掌握頻數分布直方圖的意義及畫法 使學生了解描述資料的另一種統計圖 直方圖,通過事例掌握用直方圖的幾個重要步驟,理解組距 頻數 頻數分布的意義,能繪製頻數分布圖。教學重點 資料整理的幾個重要步驟 教學難點 對資料的分組及頻數分布表的製作 一 溫故知新 1.前面學習的描...

opencv常用函式及資料結構

1.cvcreateimage 建立頭並分配資料 iplimage cvcreateimage cvsize size,int depth,int channels size 影象寬 高.depth 影象元素的位深度,可以是下面的其中之一 ipl depth 8u 無符號8位整型ipl depth ...