模式识别的一般步骤是:
(1)特征提取
(2)根据特征和正负样本训练分类器
(3)利用分类器识别
HOG就是一个描述图像信息的特征。Histogram of Oriented Gradient, 既方向梯度直方图,在特定梯度方向上的梯度值总和。概念性的东西不说了,下面通过代码详细讲解。
HOG特征对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细 的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响 检测效果。因此HOG特征是特别适合于做图像中的人体检测的。
M代码如下:
function H = HOG(Im)
nwin_x = 3;%set here the number of HOG windows per bound box
nwin_y = 3;%这里暂时定为3x3,根据需要可以自己定义,standalone或者over-lap类型的都可以直接设
B = 9;%set here the number of histogram bins
[L,C] = size(Im); % L num of lines ; C num of columns
H = zeros(nwin_x*nwin_y*B,1); % column vector with zeros
Im = double(Im);
step_x = floor(C/(nwin_x+1));
step_y = floor(L/(nwin_y+1));
cont = 0;
hx = [-1,0,1];
hy = -hx';
grad_xr = imfilter(double(Im),hx); %x方向上的梯度
grad_yu = imfilter(double(Im),hy); %y方向上的梯度
angles = atan2(grad_yu,grad_xr); % 获取梯度方向
magnit = ((grad_yu.^2)+(grad_xr.^2)).^.5; %获取梯度值
for n = 0:nwin_y-1
for m = 0:nwin_x-1
cont = cont+1;
angles2 = angles(n*step_y+1:(n+2)*step_y,m*step_x+1:(m+2)*step_x);
magnit2 = magnit(n*step_y+1:(n+2)*step_y,m*step_x+1:(m+2)*step_x);
v_angles = angles2(:);
v_magnit = magnit2(:);
K = max(size(v_angles));
%assembling the histogram with 9 bins (range of 20 degrees per bin)
bin = 0;
H2 = zeros(B,1);
for ang_lim = -pi+2*pi/B:2*pi/B:pi
bin = bin+1;
for k = 1:K
if v_angles(k)<ang_lim
v_angles(k) = 100;
H2(bin) = H2(bin)+v_magnit(k); %将梯度值累加
end
end
end
H2 = H2/(norm(H2)+0.01); %归一化,其中norm = sqrt(sum(xi^2))
H((cont-1)*B+1:cont*B,1) = H2;
end
end