前言
Hough变换是1962年由Hough提出来的,用于检测图像中直线、圆、抛物线、椭圆等形状能够用一定函数关系描述的曲线。
在这里我们重点研究的是利用Hough变换检测图中的直线。
Hough变换原理之基础一

讯享网
对于上图中的直线L,用常规方程表示
L: y=ax+b
那么用极坐标怎么表示呢?
对于任意的R,都有
R×cos(β-θ)=ρ
展开得
R×cosβcosθ+R×sinβsinθ=ρ
又x=R×cosβ y=R×sinβ(这个就不用解释了吧 高中知识了 O(∩_∩)O)
x×cosθ+y×sinθ=ρ
从这个极坐标表示的式子来看,是不是在一条直线上面所有的(x,y)都对应一个ρ、θ呢?
所以这个就是hough变换的:点-线对偶性
通俗的讲:在直角坐标系中的一条直线,在极坐标下,其实就是一个点,坐标为(ρ,θ)
Hough变换原理之基础二

由a、b两图:位于一条直线上的两点,在极坐标会产生一个交点,说明他们共线。
可是在直角坐标系中明明只有两个点,b图中反而是两条曲线?

对于任意一点,过该点有无数条直线,每条直线都有一个(ρ,θ)值,那么无数条直线,就会组成连续的(ρ,θ)值,就会构成极坐标系下的一条连续曲线。

如下图,利用函数就可以找到相交曲线数最多的一个点。

那么找到该点有什么用呢?
找到该点,就可以得到(ρ,θ)值、直线起始、终止点坐标。(MATLAB提供函数支持)
Hough变换原理之基础三
这里来说说,计算机是怎么由(ρ,θ)坐标图找到相交曲线最多的那个点。
首先,提供一个坐标轴

这里就说简单些:在基础二我们可以得出一个点在极坐标系下的一条曲线
然后我们对该曲线进行细分,分成很多个点(得到坐标)
在第一步提供的坐标轴里面,凡是前面分出来的点坐标,该位置的值就累加1
重复所有点,就可以得出一副累加图
如果需要找到曲线相交最多那个点,就只需要在该坐标轴中找到值最大的点坐标即可。
Hough变换原理总结
- 极坐标与直角坐标系变换
- 得出每个点在极坐标系的曲线(或直线)
- 在极坐标系绘画出所有曲线,利用累加的方法寻找需要的点
- 找到该点,得出(ρ,θ)、直线的起始点、终点坐标
利用Hought变换寻找图像中的最长直线
I = imread('k3.png'); I=rgb2gray(I); figure; subplot(131), imshow(I); % Rotate the image rotI = I; % Create a binary image BW = edge(rotI, 'canny'); subplot(133), imshow(BW); % Create the hough transform using the binary image [H, T, R] = hough(BW); figure, imshow(H, [], 'XData', T, 'YData', R, 'InitialMagnification', 'fit'); xlabel('\theta'), ylabel('\rho'); axis on, axis normal, hold on; colormap(gca, hot); % Find peaks in the hough transform of the image P = houghpeaks(H, 1); x = T(P(:,2)); y = R(P(:,1)); plot(x, y, 's', 'color', 'blue'); % Find lines and plot them lines = houghlines(BW, T, R, P, 'FillGap', 5, 'MinLength', 7); figure, imshow(rotI), hold on; max_len = 0; for k = 1 : length(lines) % here length(lines)=12 xy = [lines(k).point1; lines(k).point2]; % Determine the endpoints of the longest line segment len = norm(lines(k).point1 - lines(k).point2); % distance between point1 and point2 if ( len > max_len ) max_len = len; xy_long = xy; xy = [lines(k).point1; lines(k).point2]; end end plot(xy(:, 1), xy(:, 2), 'LineWidth', 2, 'Color', 'green'); % Plot beginnings and ends of lines plot(xy(1,1), xy(1,2), 'x', 'LineWidth', 2, 'Color', 'yellow'); plot(xy(2,1), xy(2,2), 'x', 'LineWidth', 2, 'Color', 'red');
讯享网
结果

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/47618.html