一、原理
这篇文章讲得非常详细且通俗易懂:https://blog.csdn.net/coming_is_winter/article/details/72850511
二、matlab接口
features = extractHOGFeatures(I)
[features,validPoints] = extractHOGFeatures(I,points)
[___, visualization] = extractHOGFeatures(I,___)
[___] = extractHOGFeatures(___,Name,Value)
三、代码实现
img = imread('cameraman.tif');
[r, c] = size(img);
img_dilate = zeros(r+2, c+2);
img_dilate(2:r+1, 2:c+1) = img;
cellSize = 8;
grayscale_Horizontal = zeros(r+2, c+2);
grayscale_Vertical = zeros(r+2, c+2);
Gxy = zeros(r+2, c+2);
axy = zeros(r+2, c+2);
for i = 2:r+1
for j = 2:c+1
grayscale_Horizontal(i, j) = img_dilate(i+1, j) - img_dilate(i-1, j);
grayscale_Vertical(i, j) = img_dilate(i, j+1) - img_dilate(i, j-1);
Gxy(i, j) = sqrt(grayscale_Horizontal(i, j)^2 + grayscale_Vertical(i, j)^2);
axy(i, j) = atan2(grayscale_Vertical(i, j), grayscale_Horizontal(i, j));
end
end
figure, imshow(grayscale_Horizontal);
figure, imshow(grayscale_Vertical);
features = zeros(1, length(2:cellSize:r+2-cellSize) * length(2:cellSize:c+2-cellSize) * 9);
count = 1;
for i = 2:cellSize:r+2-cellSize
for j = 2:cellSize:c+2-cellSize
win_feature = zeros(1, 9);
for win_i = 0:7
for win_j = 0:7
if(axy(i+win_i, j+win_j)>=0 && axy(i+win_i, j+win_j)<2*pi/9)
win_feature(1) = win_feature(1) + Gxy(i+win_i, j+win_j);
elseif(axy(i+win_i, j+win_j)>=2*pi/9 && axy(i+win_i, j+win_j)<4*pi/9)
win_feature(2) = win_feature(1) + Gxy(i+win_i, j+win_j);
elseif(axy(i+win_i, j+win_j)>=4*pi/9 && axy(i+win_i, j+win_j)<6*pi/9)
win_feature(3) = win_feature(1) + Gxy(i+win_i, j+win_j);
elseif(axy(i+win_i, j+win_j)>=6*pi/9 && axy(i+win_i, j+win_j)<8*pi/9)
win_feature(4) = win_feature(1) + Gxy(i+win_i, j+win_j);
elseif(axy(i+win_i, j+win_j)>=8*pi/9 && axy(i+win_i, j+win_j)<=pi)
win_feature(5) = win_feature(1) + Gxy(i+win_i, j+win_j);
elseif(axy(i+win_i, j+win_j)>=-2*pi/9 && axy(i+win_i, j+win_j)<0)
win_feature(9) = win_feature(1) + Gxy(i+win_i, j+win_j);
elseif(axy(i+win_i, j+win_j)>=-4*pi/9 && axy(i+win_i, j+win_j)<-2*pi/9)
win_feature(8) = win_feature(1) + Gxy(i+win_i, j+win_j);
elseif(axy(i+win_i, j+win_j)>=-6*pi/9 && axy(i+win_i, j+win_j)<-4*pi/9)
win_feature(7) = win_feature(1) + Gxy(i+win_i, j+win_j);
elseif(axy(i+win_i, j+win_j)>=-8*pi/9 && axy(i+win_i, j+win_j)<-6*pi/9)
win_feature(6) = win_feature(1) + Gxy(i+win_i, j+win_j);
else
win_feature(5) = win_feature(1) + Gxy(i+win_i, j+win_j);
end
end
end
features(count:count+8) = win_feature;
count = count + 9;
end
end
features = features ./ sqrt(sum(features .^2));