hog特徵的簡單實現
針對hog特徵不做過多的解釋;
可參考其他博主的原理介紹。
本文是matlab版本的實現。
該版本的hog特徵將影象resize為64*128
首先將rgb轉灰度圖
再進行伽馬校正
對伽馬校正後的影象做歸一化處理
(為什麼這樣做,請參看其他博主具體的原理介紹)
伽馬校正使用的是
opencv中的normalize函式
norm_minmax:(ak不屬於,min(ai),當ak等於max(ai)時p=1,等於min(ai)時p=0)
公式如下
具體參見:
接下來計算梯度和方向。
再歸一化。
最終統計直方圖。
這裡有乙個小問題,梯度的歸一化沒有用到,這個需要做測試
驗證歸一化後再統計的識別結果好還是未歸一化後的結果好?
角度用的是0-180
針對統計結果在做l2的歸一化。
這裡的統計直接統計88的塊,且沒有疊加。因此特徵量小。
特徵量是168*9=1152
由於該演算法硬體加速,未作更複雜的統計。
function his_gra_all=hog_matlab(i)
img=i;
img=imresize(img,[128 64]);
[m n]=size(img(:,:,1));
%轉灰度圖
%img=rgb2gray(img);
img=img(:,:,1)*0.3+img(:,:,2)*0.59+img(:,:,3)*0.11;
%figure;imshow(uint8(img))
%t伽馬校正
img=sqrt(double(img));
%img1=int8(img);
%%伽馬校正歸一化
max=max(max(img));
min=min(min(img));
temp=0;
for i=1:m
for j=1:n
if(img(i,j)==max)
temp=1;
endif(img(i,j)==min)
temp=0;
endif(img(i,j)~=min&&img(i,j)~=max)
temp=img(i,j)/(max-min);
endimg_n1(i,j)=temp*255;
endendaaa=uint8(img_n1);
%figure;
%imshow(uint8(img_n1));
%%計算梯度
gimg_d=zeros(m,n);
gimg_m=zeros(m,n);
for i=2:m-1
for j=2:n-1
gx=img_n1(i,j+1)-img_n1(i,j-1);
gy=img_n1(i+1,j)-img_n1(i-1,j);
gxy=int16(sqrt(gx*gx+gy*gy));
theta=abs((atan2(gy,gx)*180)/pi);
%theta=atan2d(double(gy),double(gx));
gimg_d(i,j)=theta;
gimg_m(i,j)=gxy;
endend% figure;
% imshow(uint8(gimg_d));
% figure;
% imshow(uint8(gimg_m));
%%梯度歸一化
max1=max(max(gimg_d));
min1=min(min(gimg_d));
for i=1:m
for j=1:n
temp=((gimg_d(i,j)-min1)*255)/(max1-min1);
if(temp>255)
temp=255;
endimg_n2(i,j)=temp;
endend% figure;
% imshow(uint8(img_n2));
%%統計直方圖
gimg_d=double(gimg_d);
gimg_m=double(gimg_m);
step=8;%步長為8 網格大小為8*8
cell_size=8;
his_num=9;
his_gra=zeros(1,9);
his_gra_all=;
g_t=1;
g_sum=0;
%先判斷屬於0-180的哪個區間 再按照比例分配幅值
for i=1:m/step
for j=1:n/step
gd=gimg_d((i-1)*8+1:i*8,((j-1)*8+1):j*8);
gm=gimg_m((i-1)*8+1:i*8,((j-1)*8+1):j*8);
for i1=1:cell_size
for j1=1:cell_size
h_d=gd(i1,j1);
h_d0=h_d/20;
h_d1=double(floor(h_d0));%向下取整
h_d2=double(ceil(h_d0));%向上取整
if(h_d1==0)
h_d1=1;
endif(h_d2==0)
h_d2=1;
endh_m=gm(i1,j1);
h_m1=((h_d2*20-h_d)/20)*h_m;
h_m2=(1-(h_d2*20-h_d)/20)*h_m;
his_gra(h_d1)= his_gra(h_d1)+h_m1;
his_gra(h_d2)=his_gra(h_d2)+h_m2;
endend
for i=1:9
g_sum=g_sum+his_gra(i)*his_gra(i);
endhis_gra=his_gra/sqrt(g_sum);
his_gra_all=[his_gra_all,his_gra];
his_gra=zeros(1,9);
g_sum=0;
endendend
HOG引數簡介及Hog特徵維數的計算
1.hog運算元 2.hog引數簡介及hog特徵維數的計算 3.hog引數簡介及hog特徵維數的計算 梯度直方圖特徵 hog 是一種對影象區域性重疊區域的密集型描述符 它通過計算區域性區域的梯度方向直方圖來構成特徵。hog特徵結合 svm分類器已經被廣泛應用於影象識別中,尤其在行人檢測中獲得了極大的...
HOG特徵的視覺化
方向梯度直方圖 histogram of oriented gradient,hog 特徵是一種在計算機視覺和影象處理中用來進行物體檢測的特徵描述子。hog特徵通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。近來做 時,為了直觀的看到hog特徵,更好的理解其含義,特地對hog特徵進行了視覺化...
基於Hog特徵的行人檢測
1 先建立相應的txt檔案 f pedestrian image 00000101 0.png f pedestrian image 00000105 0.png f pedestrian image 00000108 0.png f pedestrian image 00000110 0.png ...