#老板的每一次点赞,都是对小编精神上的支持,愿各位老板一路长虹,学习进步。
点赞点赞!!!!
#author:yyt time:2023.5.5
#机器学习—图像处理
#本文为小编第一次写文章,望见谅。主要讲解图像处理中的hough变换(从自己的理解角度)。
开始吧:
Hough变换:hough变换用于将图像中的边缘曲线检测出来。
1.直线Hough变换
1.1思路:
直线的参数描述:
极坐标表示:r=x*sinθ+y*cosθ
在笛卡尔坐标系中两点共线表示在参数坐标系中两直线交于一点
在笛卡尔坐标系中三点共线表示在参数坐标系中三直线交于一点
参数空间累加器:
在参数坐标系中通过统计相较于某点的次数表示位于笛卡尔坐标系 中某直线的点数
我们再来聊一下特征提取:
(说明特征提取的步骤与原理:通过sobel算子进行分别对x方向与y方向上进行求导,然后将两导值平方求和得到对于整个方向上的导值,我们称其为梯度,对于梯度大于某一阈值时便可认为为特征点
matlab代码:
Edge=rgb2gray(imread("test.jpg"));
Edge=padarray(Edge,[1,1],'symmetric','both');
h1=[-1 -2 -1 ; 0 0 0;1 2 1];
h2=h1';
Edge_h=conv2(Edge,h1,'valid');
Edge_v=conv2(Edge,h2,'valid');
Edge=sqrt(Edge_h.^2+Edge_v.^2);
Edge=Edge>0.2*max(Edge(:));
imshow(Edge,[]);
噪声的出现对hough变换的影响:
噪声其实也为某种特征点,我们原本是可以认为整体导值大于0的点都为特征 点,但是这就把噪声也包括在内,因此我们的解决方法是对整体导值进行二值化, 二值化是给予一个阈值,对于二值化处理十分考验阈值的选取,如果阈值过高会将 某些边缘舍去,如果阈值过低则不会舍去除去噪声。
此时有人会想起,我们可以先除噪,再进行hough变换不就好了么?
答:但是噪声不是也是某种特征点么,除噪的同时也会将边缘模糊化啊。
因此一位厉害的哥们遇到我们现在遇到的问题,他提出了一个惊世骇俗的想法: Canny变换(这人就叫canny)
1.2 hough变换的数学公式
Hough变换的数学表达式的意义:
将原图的整个范围缩小到某个曲线上,上面公式:
为直线的极坐标表达式,此处可以改变成其他曲线的表达式,因此hough变换将会得到输入曲线的边缘曲线。
下面我们以无人驾驶汽车在道路行驶为背景,利用hough变换将道路两侧的白线识别出来,并标注出。下图为无人驾驶汽车采用车载相机实时拍摄的道路场景。
Matlab代码:
Edge=rgb2gray(imread("road1.jpg"));
Edge=padarray(Edge,[1,1],'symmetric','both');
h1=[-1 -2 -1 ; 0 0 0;1 2 1];
h2=h1';
Edge_h=conv2(Edge,h1,'valid');
Edge_v=conv2(Edge,h2,'valid');
Edge1=sqrt(Edge_h.^2+Edge_v.^2);
Edge=Edge>0.72908*max(Edge(:));
%imshow(Edge,[]);
[H,W]=size(Edge);
MyHT=zeros(360,ceil(sqrt(H^2+W^2))+1);
for i =1:H
for j = 1:W
if Edge(i,j)==1
for theta=1:360
r=i*cos(theta*pi/180)+j*sin(theta*pi/180);
if round(r)>0
MyHT(theta,round(r))=MyHT(theta,round(r))+1;
end
end
end
end
end
[theta,r]=find(MyHT==max(MyHT(:)));
theta=theta(1);
r=r(1);
inimg=imread("road1.jpg");
for x = 1:H
%for y = 1:W
y=(r-x*cos(theta*pi/180))/sin(theta*pi/180);
y=round(y);
if ((y>0) && (y<W-5))
for i = y:y+5
inimg(x,i,1)=255;
inimg(x,i,2)=0;
inimg(x,i,3)=0;
end
end
%end
end
%imshow(MyHT,[]);
imshow(inimg,[]);
结果展示:
OK,that's all.