✅作者简介:热爱科研的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

⛄ 运行结果

【图像检测】基于Hough变换曲线检测附matlab代码_ci

【图像检测】基于Hough变换曲线检测附matlab代码_ci_02

⛄ 参考文献

[1] 喻小龙, 肖永生, 聂江华,等. 基于改进Hough变换的红外图像直线检测[J]. 空天防御, 2021.

[2] 滕今朝, 邱杰. 利用Hough变换实现直线的快速精确检测[J]. 中国图象图形学报, 2008, 13(2):4.

[3] 岳去畏. 基于Hough变换的血液细胞光散射相位图像识别研究[D]. 江苏大学, 2012.

[4] 姜泽, 董昱. 基于Hough变换和Catmull-Rom样条曲线的钢轨检测算法[J]. 图学学报, 2018, 39(6):6.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料