版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mr_muli/article/details/81607119
- 边缘直方图–matlab实现
- 参考博客:https://blog.csdn.net/u012978091/article/details/45915193
- 原理:
- 代码:
% 边缘方向直方图的算法具体如下:
% (1) 图像灰度化
% (2) 将图像进行边缘算子 (如 Sobel运 算, 得到( x, y) 点的 dx 和 dy
% (3) 计算各个像素的边缘方向 θ( x, y) = argtg( dx / dy)
% (4) 将边缘方向值进行量化, 从 0°~180°量化到 0°~36°
% (5) 将边缘方向值 θ进行直方图统计并归一化
clc;close all;clear;
rgb_img=imread('../images/8.jpg');
subplot(1,2,1);imshow(rgb_img);
% 图像灰度化
gray_img=rgb2gray(rgb_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(1,2,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))...
+gray_img(cir1,cir2+1)-gray_img(cir1,cir2-1);
Gy(cir1,cir2)=sum(gray_img(cir1+1,cir2-1:cir2+1))...
-sum(gray_img(cir1-1,cir2-1:cir2+1))...
+gray_img(cir1+1,cir2)-gray_img(cir1-1,cir2);
% 为避免分母为0,加上一个很小的值。
Gx(cir1,cir2)=Gx(cir1,cir2)+(Gx(cir1,cir2)==0)*1e-6;
% atan2:计算边缘方向;范围:[-pi,pi];弧度->角度: [-180,180]
theta(cir1,cir2)=atan2(Gy(cir1,cir2),Gx(cir1,cir2))*180/pi;
end
end
% 将[-180,180]每10度分为一组,那么方向被量化为36 bin
TH=[-170,-160,-150,-140,-130,-120,-110,-100,-90, -80,-70,-60,-50,-40,-30,-20,-10, 0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180;...
-180,-170,-160,-150,-140,-130,-120,-110,-100,-90,-80,-70,-60,-50,-40,-30,-20,-10,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170];
% 存储各方向像素数目的数组
bar_hist= zeros(1,36);
% edge_theta=theta&edge_canny;
for cir1=1:row
for cir2=1:col
for k=1:36
if (edge_canny(cir1,cir2)==1 & theta(cir1,cir2)<TH(1,k) & theta(cir1,cir2)>=TH(2,k))
bar_hist(k)=bar_hist(k)+1;
end
end
end
end
% 直方图归一化
bar_hist=bar_hist/sum(bar_hist);
disp(['bar_hist值为:',num2str(bar_hist)]);
% 绘图
x=1:36;
figure;
bar(TH(1,:),bar_hist(x));