✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
对于航空图像中目标的检测和物体识别。论文根据图像自身的特征,提出基于直线段的特征检测,利用Hough变换进行提取。并选择了几种典型的算法在Matlab语言环境下用程序进行实现。最后,对航空图像中自动物体分割和检测的研究前景进行了展望
⛄ 代码
function CurveDetectionbyHough
%~~~~~~~~~~~~~~~~~~~~~~~第四次数图实验说明~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
% 1、实验最初,需要选择其中一种加噪方式。
% 2、边缘检测后,需要观察、选择其中一个算子继续处理,以减小程序耗时。
% 3、简化实验参数range、delta、min都是预实验得到的最佳参数,不建议更改。
% 4、坐标系:→x坐标
% ↓ y坐标
% 原点为(1,1)
% 2018-5-22 by XING
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
clear;close all;clc;
fprintf('**********************加噪图像曲线检测实验**********************\n');
I = im2double(rgb2gray(imread('houghorg.bmp')));
fprintf('\n~~~~~~~~~~~~~~~Part0: 图像加噪~~~~~~~~~~~~~~~\n');
fprintf(' 选择添加噪声类型:\n');
option=input(' Gaussian(1) or Salt(2):\n ');
if(option==1)
I_noised=imnoise(I,'gaussian',1e-3);
else
I_noised=imnoise(I,'salt & pepper',1e-3);
end
[height,width] = size(I_noised);
figure;
subplot(1,2,1),imshow(I);
title('\fontsize{20}原始图片');
subplot(1,2,2),imshow(I_noised);
title('\fontsize{20}加噪图片');
fprintf('\n~~~~~~~~~~~~Part1: 图像滤波和边缘检测~~~~~~~~~~~~');
%% Median Filtering
m=9;
I_smooth = medfilt2(I_noised,[m m]);% 9x9中值滤波
%% Edge Detection
% Roberts
IRoberts=edge(I_smooth,'Roberts');
figure;
subplot(1,3,1),imshow(IRoberts);
title('\fontsize{20}Roberts');
% Sobel
ISobel=edge(I_smooth,'Sobel');
subplot(1,3,2),imshow(ISobel);
title('\fontsize{20}Sobel');
% Laplacian
ILap=edge(I_smooth,'log');
subplot(1,3,3),imshow(ILap);
title('\fontsize{20}Laplacian');
suptitle('\fontsize{20}边缘检测');
fprintf('\n 对比发现,Roberts边缘检测噪点最少,后续计算量最小,因此建议选择。');
fprintf('\n 选择算子类型:\n');
option=input(' Roberts(1) or Sobel(2) or Laplacian(3):\n ');
close all;
if(option==1)
IEdge=IRoberts;
elseif(option==2)
IEdge=ISobel;
else
IEdge=ILap;
end
figure;
subplot(1,3,1),imshow(I);
title('\fontsize{20}原始图片');
subplot(1,3,2),imshow(I_noised);
title('\fontsize{20}加噪图片');
subplot(1,3,3),imshow(IEdge);
title('\fontsize{20}边缘检测')
% 将边缘点坐标放在数组X和Y中,以便后续操作。
totalnum=sum(sum(IEdge));
X=zeros(1,totalnum);
Y=zeros(1,totalnum);
k=0;
for x=1:width
for y=1:height
if IEdge(y,x)% 是轨迹点 一定要注意是y(行) x(列)
k=k+1;
X(k)=x;
Y(k)=y;
if k==totalnum
break;
end
end
end
if k==totalnum
break;
end
end
fprintf('\n~~~~~~~~Part2: 圆检测和重建叠加(Hough变换)~~~~~~~~');
%% Curve Detection by Hough
% assume that (x-a_0)^2+(y-b_0)^2=r^2
% parameter equation: (a-x_i)^2+(b-y_i)^2=r^2
% 坐标系:→x坐标
% ↓ y坐标
% 原点为(1,1)
fprintf(' \n 程序已发现 %d 个边缘轨迹点,对应 %d 个参数圆。\n',totalnum,totalnum);
fprintf(' 警告:\n');
fprintf(' 如果把412x315个点都当作潜在圆心点进行计算,耗时将很长很长。\n');
fprintf('\n 通过观察图像,我们可以缩小计算范围:\n');
fprintf(' 1、圆心位于(230,175)左右,圆心计算范围可缩小至附近20x20区域;\n');
fprintf(' 这样只需要统计400个点,计算量较小;\n');
apro_min=220;
bpro_min=165;
range=20;
APRO=(apro_min:apro_min+range-1)';
BPRO=(bpro_min:bpro_min+range-1)';
fprintf(' 2、半径长度在95左右,半径计算范围可缩小至85:105。\n');
r_min=85;
range2=20;
fprintf('\n Program paused. Press enter to continue.\n');
pause;
% 求解二元隐函数非常非常复杂。我们反过来,在20x20方阵内,逐点验证是否可能为参数圆的轨迹点。
% 误差delta可调,在正负delta内都算有效解。预实验建议值为25。
% 预实验说明,当delta较小时,最大频次很小,统计误差很大。
delta=50;
r_step=0.5;
count=0;
A_Maxpro=[];
B_Maxpro=[];
RMAXNUM=[];
tic;
for r=r_min:r_step:r_min+range2 % 半径也取决于统计峰值
count=count+1;
Frequency=zeros(range,range);% 该20x20方阵点出现在参数圆轨迹中的次数
for k=1:totalnum %逐个样本
left=repmat(((APRO-X(k)).^2)',range,1)+repmat((BPRO-Y(k)).^2,1,range);
right=r^2;
Difference=round(left-right);
ISSOLUTION=(Difference<delta & Difference>-delta);
Frequency=Frequency+ISSOLUTION;
end
maxFrequency=max(Frequency(:));% 找出统计峰值
[b_maxpro,a_maxpro]=find(Frequency==max(Frequency(:)));% 具有统计峰值,意味着该点最有可能是圆心(a_0,b_0)
A_Maxpro=[A_Maxpro;a_maxpro];
B_Maxpro=[B_Maxpro;b_maxpro];
RMAXNUM=[RMAXNUM;maxFrequency];
% 以上三者,记录的是在某一个r下的统计峰值和圆心坐标
end
final_max_Rposition=find(RMAXNUM==max(RMAXNUM));
R=r_min+(final_max_Rposition-1)*r_step;% 在所有r下的最大峰值对应的半径r
final_a_pro=A_Maxpro(final_max_Rposition)+apro_min;
final_b_pro=B_Maxpro(final_max_Rposition)+bpro_min;
fprintf(' \n Hough圆形边缘检测结果:Centre=(%d,%d),Radius=%.1f。\n',final_a_pro,final_b_pro,R);
fprintf(' Hough检测耗时:%.3f s。\n', toc);
%% Image Superposition
% Restruction
IRe=zeros(height,width);% 再次注意先行数后列数
delta2=1;
for m=1:height
for n=1:width
r_cal=sqrt((n-final_a_pro)^2+(m-final_b_pro)^2);
if (r_cal<R+delta2 && r_cal>R-delta2)
IRe(m,n)=1;
end
end
end
IRe=IRe+IEdge;
close all;
figure;
subplot(2,2,1),imshow(I);
title('\fontsize{20}原始图片');
subplot(2,2,2),imshow(I_noised);
title('\fontsize{20}加噪');
subplot(2,2,3),imshow(IEdge);
title('\fontsize{20}边缘检测');
subplot(2,2,4),imshow(IRe);
title('\fontsize{20}重建');
fprintf('\n**********************第四次数图实验结束**********************\n');
fprintf(' Written by 海神之光\n');
fprintf(' 2023-4-08 China\n');
end
⛄ 运行结果
⛄ 参考文献
[1] 喻小龙, 肖永生, 聂江华,等. 基于改进Hough变换的红外图像直线检测[J]. 空天防御, 2021.
[2] 滕今朝, 邱杰. 利用Hough变换实现直线的快速精确检测[J]. 中国图象图形学报, 2008, 13(2):4.
[3] 岳去畏. 基于Hough变换的血液细胞光散射相位图像识别研究[D]. 江苏大学, 2012.
[4] 姜泽, 董昱. 基于Hough变换和Catmull-Rom样条曲线的钢轨检测算法[J]. 图学学报, 2018, 39(6):6.