HOG特征向量的代码 源代码MATLAB

来源:互联网 发布:天命神童 知乎 编辑:程序博客网 时间:2024/06/05 14:25
[html] view plain copy
  1. <pre name="code" class="cpp">function HOGFeature = ImgHOGFeature( imgPathName, cell_size, nblock,...,  
  2.     overlap, angle, bin_num)  
  3. % 计算输入图像的特征描述子  
  4. % imgPathName:图片路径  
  5. % cell_size: cell的长宽  
  6. % nblock: block的width、height包括的cell的个数  
  7. % overlap: block重叠的比例  
  8. % angle: 180\360  
  9. % bin_num: 方向bin的数目  
  10.    
  11. if nargin<2  
  12.     % default parameter  
  13.     cell_size=8;  
  14.     nblock=2;  
  15.     overlap=0.5;  
  16.     angle=180;  
  17.     bin_num=9;  
  18. elseif nargin<6  
  19.     error('Input parameters are not enough.');  
  20. end  
  21.    
  22. Img = imread(imgPathName);  
  23. if size(Img,3) == 3  
  24.     % 简化计算,直接转换成灰度图像  
  25.     G = rgb2gray(Img);  
  26. else  
  27.     G = Img;  
  28. end  
  29.    
  30. [height, width] = size(G);  
  31.    
  32. % 计算x、y方向的梯度  
  33. hx = [-1,0,1];  
  34. hy = -hx';  
  35. grad_x = imfilter(double(G),hx);  
  36. grad_y = imfilter(double(G),hy);  
  37.    
  38. % 计算梯度的模长  
  39. grad_mag=sqrt(grad_x.^2+grad_y.^2);  
  40.    
  41. % 计算梯度的方向  
  42. indexgrad_x==0;  
  43. grad_x(index)=1e-5;  
  44. YX=grad_y./grad_x;  
  45. if angle==180  
  46.     grad_angle= ((atan(YX)+(pi/2))*180)./pi;   
  47. elseif angle==360  
  48.     grad_angle= ((atan2(grad_y,grad_x)+pi).*180)./pi;  
  49. end  
  50.    
  51. % orient bin  
  52. bin_angle=angle/bin_num;  
  53. grad_orient=ceil(grad_angle./bin_angle);  
  54.    
  55. % 计算block的个数  
  56. block_size=cell_size*nblock;  
  57. skip_step=block_size*overlap;  
  58. x_step_num=floor((width-block_size)/skip_step+1);  
  59. y_step_num=floor((height-block_size)/skip_step+1);  
  60.    
  61. % 初始化hog特征描述子  
  62. feat_dim=bin_num*nblock^2;  
  63. HOGFeature=zeros(feat_dim,x_step_num*y_step_num);  
  64.    
  65. for k=1:y_step_num  
  66.     for j=1:x_step_num  
  67.         % block的左上角坐标  
  68.         x_off = (j-1)*skip_step+1;  
  69.         y_off = (k-1)*skip_step+1;  
  70.    
  71.         % 取得block的梯度大小和方向  
  72.         b_mag=grad_mag(y_off:y_off+block_size-1,x_off:x_off+block_size-1);  
  73.         b_orient=grad_orient(y_off:y_off+block_size-1,x_off:x_off+block_size-1);  
  74.    
  75.         % 当前block的hog直方图  
  76.         currFeat = BinHOGFeature(b_mag, b_orient, cell_size,nblock, bin_num, false);  
  77.         HOGFeature(:, (k-1)*x_step_num+j) = currFeat;  
  78.    
  79.     end  
  80. end  
  81.    
  82. end  
  83. function blockfeat = BinHOGFeature( b_mag,b_orient,cell_size,nblock,...  
  84.     bin_num, weight_vote)  
  85. % 计算1个block的hog  
  86. % weight_vote: 是否进行高斯加权投票  
  87.    
  88. % block的HOG直方图  
  89. blockfeat=zeros(bin_num*nblock^2,1);  
  90.    
  91. % 高斯权重  
  92. gaussian_weight=fspecial('gaussian',cell_size*nblock,0.5*cell_size*nblock);  
  93.    
  94. % 分割block  
  95. for n=1:nblock  
  96.     for m=1:nblock  
  97.         % cell的左上角坐标  
  98.         x_off = (m-1)*cell_size+1;  
  99.         y_off = (n-1)*cell_size+1;  
  100.    
  101.         % cell的梯度大小和方向  
  102.         c_mag=b_mag(y_off:y_off+cell_size-1,x_off:x_off+cell_size-1);  
  103.         c_orient=b_orient(y_off:y_off+cell_size-1,x_off:x_off+cell_size-1);  
  104.    
  105.         % cell的hog直方图  
  106.         c_feat=zeros(bin_num,1);  
  107.         for i=1:bin_num  
  108.             % 是否进行高斯加权 投票  
  109.             if weight_vote==false  
  110.                 c_feat(i)=sum(c_mag(c_orient==i));  
  111.             else  
  112.                 c_feat(i)=sum(c_mag(c_orient==i).*gaussian_weight(c_orient==i));  
  113.             end  
  114.         end  
  115.    
  116.         % 合并到block的HOG直方图中  
  117.         count=(n-1)*nblock+m;  
  118.         blockfeat((count-1)*bin_num+1:count*bin_num,1)=c_feat;  
  119.     end  
  120. end  
  121.    
  122. % 归一化 L2-norm  
  123. sump=sum(blockfeat.^2);  
  124. blockfeat = blockfeat./sqrt(sump+eps^2);  
原创粉丝点击