【图像处理——hough变换那些事】

本文介绍了Hough变换作为图像处理中的一个重要技术,用于检测图像中的直线。通过解释直线的参数描述、Hough变换的数学公式和噪声处理,文章详细阐述了如何利用Hough变换进行边缘检测。此外,还讨论了Canny变换作为解决噪声问题的方法,并展示了在无人驾驶场景中应用Hough变换识别道路白线的实例。
摘要由CSDN通过智能技术生成

#老板的每一次点赞,都是对小编精神上的支持,愿各位老板一路长虹,学习进步。

点赞点赞!!!!

#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.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值