HOG用了很久,今天试着自己写了一个
大部分用的还是matlab工具箱的函数
梯度直方图差值哪里没有编写
代码里有最后显示成向量图的方法
程序编的不对的地方,请大家指正。
第一个是主程序:
clc; clear; image = imread('crop001019.png'); figure; imshow(image); image = double(image); image = imresize(image,[128 64]); block = zeros(16,16); cell = 8; block = 16; for i = 0:1:14 for j = 0:1:6 for n = 1:1:16 for k = 1:1:16 block(n,k) = image(i*8+n,j*8+k); end end feature = hist(block); for e = 1:1:2 for t = 1:1:2 result(i*2+e,j*2+t,:) = feature(e,t,:); end end end end w = result; bs = 8; bim1 = zeros(bs, bs); bim1(:,round(bs/2):round(bs/2)+1) = 1; bim = zeros([size(bim1) 9]); bim(:,:,1) = bim1; for i = 2:9, bim(:,:,i) = imrotate(bim1, -(i-1)*20, 'crop'); end s = size(w); w(w < 0) = 0; im = zeros(bs*s(1), bs*s(2)); for i = 1:s(1), iis = (i-1)*bs+1:i*bs; for j = 1:s(2), jjs = (j-1)*bs+1:j*bs; % k = find(w(i,j,:)==max(w(i,j,:))); % if length(k)>1 % k = k(1); % end for k=1:1:9 im(iis,jjs) = im(iis,jjs) + bim(:,:,k) * w(i,j,k); end end end scale = max(w(:)); im = uint8(im * (255/scale)); % im = uint8(im); figure; imshow(im);其中的hist为计算每个block的梯度直方图
返回一个2*2*9的矩阵。
代码如下:
function feature = hist(block) block = block; feature = zeros(2,2,9); for i = 0:1:1 for j = 0:1:1 for k = 1:1:8 for n = 1:1:8 cell(k,n) = block(i*8+k,j*8+n); end end hx = [-1,0,1]; hy = -hx'; Fx = imfilter(double(cell),hx); Fy = imfilter(double(cell),hy); Q = atan2(Fy,Fx); Q = abs(Q); Q = Q.*180./pi; Q = round(Q); for u = 1:1:64 if Q(u)>=0&Q(u)<20 feature(i+1,6) = feature(i+1,6) + 1; end if Q(u)>=20&Q(u)<40 feature(i+1,5) = feature(i+1,5) + 1; end if Q(u)>=40&Q(u)<60 feature(i+1,4) = feature(i+1,4) + 1; end if Q(u)>=60&Q(u)<80 feature(i+1,3) = feature(i+1,3) + 1; end if Q(u)>=80&Q(u)<100 feature(i+1,2) = feature(i+1,2) + 1; end if Q(u)>=100&Q(u)<120 feature(i+1,1) = feature(i+1,1) + 1; end if Q(u)>=120&Q(u)<140 feature(i+1,9) = feature(i+1,9) + 1; end if Q(u)>=140&Q(u)<160 feature(i+1,8) = feature(i+1,8) + 1; end if Q(u)>=160&Q(u)<=180 feature(i+1,7) = feature(i+1,7) + 1; end end end end feature = feature./64;