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

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

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

⛳️ 代码获取关注我

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


相关文章
|
2月前
|
算法 定位技术 计算机视觉
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
114 0
|
2月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
147 8
|
2月前
|
机器学习/深度学习 编解码 算法
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
144 8
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
213 0
|
2月前
|
算法 机器人 计算机视觉
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
|
2月前
|
新能源 Java Go
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
109 0
|
2月前
|
机器学习/深度学习 数据采集 测试技术
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
|
2月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
159 8
|
2月前
|
编解码 运维 算法
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
156 12
|
2月前
|
人工智能 数据可视化 网络性能优化
【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究(Matlab代码实现)
【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究(Matlab代码实现)
106 9

热门文章

最新文章