rgb_img=imread('man.jpg');
gray_img=rgb2gray(rgb_img);
subplot(2,1,1);imshow(gray_img);
[row,col]=size(gray_img);
gray_img=double(gray_img);
% 使用canny算子,提取边缘
edge_canny=edge(gray_img,'canny');
edge_num=sum(sum(edge_canny));%边缘总点数
subplot(2,1,2);imshow(edge_canny);
%计算梯度矢量Gx,Gy
for cir1=2:row-1
for cir2=2:col-1
Gx(cir1,cir2)=sum(gray_img(cir1-1:cir1+1,cir2+1))-sum(gray_img(cir1-1:cir1+1,cir2-1))...
Gy(cir1,cir2)=sum(gray_img(cir1+1,cir2-1:cir2+1))-sum(gray_img(cir1-1,cir2-1:cir2+1))...
Gx(cir1,cir2)=Gx(cir1,cir2)+(Gx(cir1,cir2)==0)*1e-6; % 为避免分母为0,加上一个很小的值。
theta(cir1,cir2)=atan2(Gy(cir1,cir2),Gx(cir1,cir2))*180/pi;
%atan2:计算边缘方向;范围:[-pi,pi];弧度->角度: [-180,180]
end
end
% 将[-180,180]每10度分为一组,那么方向被量化为36 bin
TH=[-170,-160,-150,-140,-130,-120,-110,-100,-90,-80,
% 存储各方向像素数目的数组
bar_hist= zeros(1,36);
ge_theta=theta&edge_canny;
for cir1=1:row
=TH(2,k)) end disp(bar_hist); [3]另一代码见:http://www.zhizhihu.com/html/y2009/41.html 参考文献: [1]基于边缘直方图的快速汽车标志识别方法 [2]http://hi.baidu.com/tqjcwtcdgzcjrse/item/4673d9d2d88a02c81a72b413 |
---|