function result = hog_com(im)%
[u,uu,uuu]=size(im);
if uuu>2
im=rgb2gray(im);
end
im=imresize(im,[30 30]);
img=double(im);
%figure;
%imshow(img,[]);%显示图像
step=8; %step*step个像素作为一个cell
[m1 ,n1]=size(img);%获取图像尺寸
%改变图像尺寸为step的最近整数倍,要不然后面就会发生错误
img=imresize(img,[floor(m1/step)*step,floor(n1/step)*step],'nearest');
[m,n]=size(img);
% 1、伽马校正
%figure;
img=sqrt(img);
%imshow(img,[]);%显示图像
%% 下面是求边缘,也就是滤波,求梯度
fy=[-1 0 1]; %定义竖直模板
fx=fy'; %定义水平模板,该符号为转置
Iy=imfilter(img,fy,'replicate'); %竖直边缘
Ix=imfilter(img,fx,'replicate'); %水平边缘
Ied=sqrt(Ix.^2+Iy.^2); %边缘强度 求梯度的长度
Iphase=Iy./Ix; %边缘斜率,有些为inf,-inf,nan,其中nan需要再处理一下
%figure; %% 创建一个画板
%imshow(Ied,[]); %显示梯度提取后的值
%% 下面是求cell
orient=9; %方向直方图的方向个数
angular=360/orient; %每个方向包含的角度数,划分角度区间,0到40度一个区间...
Cell=cell(1,1); %所有的角度直方图,cell是可以动态增加的,所以先设了一个
%% 开始获取orient个方向的特征向量
ii=1;
jj=1;
for i=1:step:m-step %如果处理的m/step不是整数,最好是i=1:step:m-step
ii=1;
for j=1:step:n %注释同上
tmpx=Ix(i:i+step-1,j:j+step-1); %水平
%% 边缘强度
tmped=Ied(i:i+step-1,j:j+step-1);
%% 局部边缘强度归一化
tmped=tmped/sum(sum(tmped));
%% 边缘斜率局部提取
tmpphase=Iphase(i:i+step-1,j:j+step-1);
%% 创建直方图
Hist=zeros(1,orient); %当前step*step像素块统计角度直方图,就是cell
%% 统计一个块里面的梯度信息
for p=1:step
for q=1:step
%% 判断是不是一个数字True for Not-a-Number.如果不是一个数字,就归零
if isnan(tmpphase(p,q))==1 %因为会遇到0/0的情况
tmpphase(p,q)=0;
end
%% 进行区间的划分
ang=atan(tmpphase(p,q)); %atan求的是[-90 90]度之间
ang=mod(ang*180/pi,360); %全部变正,-90变270
if tmpx(p,q)<0 %根据x方向确定真正的角度
if ang<90 %如果是第一象限
ang=ang+180; %移到第三象限
end
if ang>270 %如果是第四象限
ang=ang-180; %移到第二象限
end
end
ang=ang+0.0000001; %防止ang为0
Hist(ceil(ang/angular)) = Hist(ceil(ang/angular))+tmped(p,q); %ceil向上取整,使用边缘强度加权
end
end
%% 方向直方图归一化
Hist=Hist/sum(Hist);
Cell{ii,jj}=Hist; %放入Cell中
ii=ii+1; %针对Cell的y坐标循环变量
end
jj=jj+1; %针对Cell的x坐标循环变量
end
%% 下面是求feature,2*2个cell合成一个block,没有显式的求block
[m2, n2]=size(Cell);
feature=cell(1,(m2-1)*(n2-1));
for i=1:m2-1
for j=1:n2-1
f=[];
f=[f Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)'];
feature{(i-1)*(n2-1)+j}=f;
end
end
l=length(feature);
f=[];
for i=1:l
f=[f;feature{i}(:)'];
end
%figure
%mesh(f)
feature
f1=[];
for i=1:l
f1=[f1,feature{i}(1:2)];
end
result=f1
for t=1:length(result);
if isnan(result(t))==1
result(t)=0
end
end