劉躍鋒, 宋永霞, 李松濤
(長春工業(yè)大學(xué)計算機(jī)科學(xué)與工程學(xué)院,吉林長春 130012)
根據(jù)圖像的亮度信息并對其進(jìn)行投影,得到的即為圖像的灰度直方圖,利用直方圖技術(shù)對圖像進(jìn)行特征提取、邊緣檢測、分割等處理,可以得到想要的具有預(yù)定效果的圖像,方便對其做進(jìn)一步的處理。
在一幅數(shù)字圖像中,若其范圍在[0,G]內(nèi)總共包含有L級灰度,則其直方圖定義應(yīng)為一個離散函數(shù),即:h(rk)=nk,其中rk是區(qū)間[0,G]內(nèi)的第k級亮度,nk是灰度級為rk的圖像中的像素數(shù)。對于uint8類圖像,G值為255;對于uint16類圖像,G值為65535;對于double類圖像,G值為1.0。也就是說,對于uint8或者uint16類圖像,G=L-1。通常會用到歸一化直方圖,即使用所有元素h(rk)除以像素總數(shù)n所得到的圖形。其公式為:
在Matlab仿真工具中,可以用imhist(f,b)函數(shù)獲得圖像的直方圖。其中,f為輸入圖像,b為灰度級的個數(shù)。若要得到歸一化的直方圖,則需使用函數(shù)p=imhist(f,b)/numel(f)得到。其中,函數(shù)numel(f)給出數(shù)組f的元素個數(shù)。
圖像的分割和邊緣檢測是圖像處理中的一個重要方面[2],對于一幅原始圖像,不管要對其進(jìn)行哪種操作,都要求首先確定整幅圖像中有用信息與背景信息的區(qū)域,然后才能對該幅圖像的有用信息區(qū)域進(jìn)行想要做出的處理,而要達(dá)到這個目的,就要用到圖像的邊緣檢測和圖像分割技術(shù)。同時,要對圖像進(jìn)行想要的操作,就要盡可能得到圖像有用信息齊全的、不相關(guān)的特征,這也同時要求研究者進(jìn)行更加有利的特征提取方法研究。下面就這兩個方面的方法進(jìn)行介紹。
對于一幅待處理的圖像,要最大程度地得到圖像的有用信息,首先就要去除圖像背景圖像的干擾,這就要檢測出圖像有用信息的邊緣,以便對其進(jìn)行處理[3]。在這里采用把一幅圖像先進(jìn)行二值化處理,把背景圖像的灰度值設(shè)置為0,信息圖像灰度值設(shè)置為1,然后,對圖像的各種像素信息在各個方向進(jìn)行投影,從而得到圖像的像素信息在各個方向上的直方圖[4]。根據(jù)投影直方圖所在位置區(qū)別,就能得到圖像有用信息在各個方向上的邊界,這樣就實(shí)現(xiàn)了圖像的邊緣檢測。
一幅待處理的圖像如圖1所示(這幅圖像還沒有進(jìn)行邊緣檢測和分割)。
圖1 待處理的圖像
確定邊界并對其歸一化后的圖像如圖2所示。
圖2 確定邊界后的圖像
為了突出圖像的區(qū)別,把周圍背景色彩設(shè)置為黑色。
通過圖1和圖2的比較可以看出,圖2是在圖1的基礎(chǔ)上通過得到上、下和左、右投影直方圖之后,確定其邊界,而對于圖像的其它信息并沒有什么影響。同理,對于一幅擁有多組有用信息的圖像,根據(jù)圖像有用信息在同一方向上的投影直方圖位置之間的差異是否超出自己所設(shè)定的閾值,就能對圖像進(jìn)行合理準(zhǔn)確的分割[5-6]。若超過閾值,則為另一組圖像;若未超過閾值,則為同一組圖像。可以用如下公式進(jìn)行圖像的分割。
式中:I——所得圖像;
Ii——第i個圖像;
Ij——第j個圖像;
sj——第j個圖像左邊界;
si——第i個圖像右邊界;
T——所設(shè)閾值。
這種方法在對文字和數(shù)字串進(jìn)行字符分割中特別適用。
邊緣檢測程序流程如圖3所示。
圖3 邊緣檢測程序流程
其Matlab程序如下:
Clc
clear all
f=imread('D:﹨ program files
﹨ MAT LAB71﹨ work ﹨ 2.1.bmp');
f1=im2bw(f,80/255);%二值化
f2=fanzhuan(f1);
f3=bwmorph(f2,'skel',3);%骨骼化
f4=bwmorph(f3,'spur',12);%去毛刺
fm=medfilt2(f4,[44]);%進(jìn)行中值濾波
f5=bwmorph(fm,'thicken',10);%粗化操作
se=strel('disk',6);
foc=imclose(f5,se);%用半徑為6的圓盤進(jìn)行閉運(yùn)算
fo=imopen(foc,se);%用半徑為6的圓盤進(jìn)行開運(yùn)算
se1=strel('disk',7)
fo1=imopen(fo,se1);%用半徑為7的圓盤進(jìn)行開運(yùn)算
f6=guiyi(f2);
其中有兩個子程序:一個是翻轉(zhuǎn)子程序,即f2=fanzhuan(f1)這一條程序;一個是歸一子程序,即f6=guiyi(f2)這一條程序。這兩個子程序如下:
function f6=guiyi(f5)
[m n]=size(f5);
for i=1:n
f(i)=0;
end;
for j=1:m
g(j)=0;
end;
for j=1:n
for i=1:m f(j)=f5(i,j)+f(j);
end;
end;%在 x軸進(jìn)行投影
j=1;
while f(j)<=0
j=j+1;
end;
a=j;%找左邊界
j=n;
while f(j)<=0
j=j-1;
end;
b=j;%找右邊界
for i=1:m
for j=1:n g(i)=f5(i,j)+g(i);
end;
end;%在y軸投影
i=1;
while g(i)<=0
i=i+1;
end;
c=i;找上邊界
i=m;
while g(i)<=0
i=i-1;
end;
d=i;%找下邊界
f6=f5(c:d,a:b);
function f2=fanzhuan(f1)
[m n]=size(f1);
for i=1:m
for j=1:n
if f1(i,j)==1
f2(i,j)=0;
else f2(i,j)=1;
end;
end;
end;
其中,翻轉(zhuǎn)子程序主要是用來確定圖像與背景的關(guān)系,歸一子程序主要對圖像進(jìn)行歸一化,即圖像的邊緣檢測。當(dāng)整個程序結(jié)束,即得到如圖2所示的圖像。
本質(zhì)上說,圖像檢索與圖像邊緣檢測是同一種方法,只要得到圖像的邊緣,就能得到圖像所在位置,同樣也就實(shí)現(xiàn)了圖像的檢索[7]。而圖像分割則是對一組圖像分別進(jìn)行邊緣檢測,待確定各個分圖像的邊緣之后,也就順利地達(dá)到了對各個分圖像分割的目的。利用這種方法對二值圖像進(jìn)行邊緣檢測和分割,不但節(jié)省了利用掩模在圖像上來回移動所需要的時間,還節(jié)省了圖像邊緣對掩模的響應(yīng)計算時間,因此,它比傳統(tǒng)的點(diǎn)、線和邊緣檢測方法更有利,更具有實(shí)用性。
首先是利用投影直方圖在自己所規(guī)定的各個方向進(jìn)行投影,得到各個方向灰度信息,然后再利用彈性網(wǎng)格結(jié)構(gòu)對各個方向的灰度信息進(jìn)行平分,從而得到各個方向的特征。由于使用的是彈性網(wǎng)格,所以得到的圖像特征不但包括圖像的結(jié)構(gòu)特征,也包括圖像的統(tǒng)計特征。與傳統(tǒng)的只用一種特征對圖像進(jìn)行處理的方法相比,不但特征的提取方法更加簡單,而且這種方法得到的特征更能保存圖像的各種有用信息,因而也使得圖像處理起來更加方便,更加準(zhǔn)確。特征提取程序流程如圖4所示。
圖4 特征提取程序流程
其Matlab程序是在邊緣檢測程序的基礎(chǔ)上再用一個子程序得到的,如下:
p=wangge(f6);
function p=wangge(f6)
[m n]=size(f6);
for i=1:m
f(i)=0;
end;
for i=1:n
g(i)=0;
end;%初始化;
s=0;
for j=1:n
for i=1:m
g(j)=f6(i,j)+g(j);
end;
s=s+g(j);
end;%求x軸投影和對其進(jìn)行均分;
for i=1:7
a(i)=0;
end;
for i=1:7
b(i)=0;
end;
for i=1:5
k(i)=0;
end;%初始化
s;k1=s/6;
a(1)=1;a(7)=n;j=1;
for i=1:5
while k(i)<k1
k(i)=g(j)+k(i);
if j<n
j=j+1;
end;
end;
a(i+1)=j;
end;%對y軸進(jìn)行投影;
for i=1:m;
for j=1:n;
f(i)=f6(i,j)+f(i);
end;
end;%對y軸投影進(jìn)行均分;
b(1)=1;b(7)=m;
for i=1:5
l(i)=0;
end;
j=1;
for i=1:5
while l(i)<k1
l(i)=f(j)+l(i);
if j<m
j=j+1;
end;
end;
b(i+1)=j;
end;
for i=1:6
for j=1:6
if k1/6<=0.20*((a(i+1)-a(i))*(b(j+1)-b(j)))%0.2為判斷閾值;
c(i,j)=0;
else c(i,j)=1;
end;
end;
for i=1:36
p(i)=0;
end;
l=1;
for j=1:6
for i=1:6
p(l)=c(i,j)
l=l+1;
end;
end;
該子程序主要是完成對獲得的圖像進(jìn)行6*6特征提取的分割。
介紹了利用直方圖對二值圖像進(jìn)行圖像分割、圖像檢索、圖像特征提取中的應(yīng)用,突出了直方圖在圖像處理中的地位,開拓了利用直方圖進(jìn)行圖像處理的思路,相信直方圖會在圖像處理中發(fā)揮更大的作用。
[1]岡薩雷斯.數(shù)字圖像處理(M atlab版)[M].北京:電子工業(yè)出版社,2006.
[2]史東承,于明會.基于數(shù)學(xué)形態(tài)學(xué)濾波的灰度圖像邊緣檢測[J].長春工業(yè)大學(xué)學(xué)報:自然科學(xué)版,2008,29(3):283-287.
[3]何書前,王建新,郭耀天,等.基于小波變換的圖像二維直方圖分割方法[J].電腦知識與技術(shù),2009(8):6278-6279.
[4]鄔長安,明生.基于灰度直方圖和投影技術(shù)的圖像檢索算法[J].光盤技術(shù),2007(5):35-37.
[5]馬超杰,李曉霞,楊華,等.基于形態(tài)學(xué)和直方圖分析的多元圖像目標(biāo)分割算法[J].航空兵器,2009(8):33-37.
[6]李立源,龔堅,陳維南.基于二維灰度直方圖最佳一維投影的圖像分割方法[J].自動化學(xué)報,1996(5):315-322.
[7]任平紅,陳矗.基于改進(jìn)的邊緣直方圖的圖像檢索方法[J].計算機(jī)技術(shù)與發(fā)展,2007(8):183-186.