MATLAB中的Houghlines

时间:2010-01-14 07:55:24

标签: matlab image-processing computer-vision hough-transform

使用Hough lines检测图像中的线条后,如何使用它来计算参考图像线条的角度(旋转)变化?

2 个答案:

答案 0 :(得分:3)

读者注意:这是一个后续问题,请参考以下内容:


这个过程类似于我之前展示的过程。下面我使用the images from your previous question(因为你只提供了一个,我通过将第一个旋转10度来创建另一个)。

我们首先检测两个图像的线条。我们在Hough transform functions的帮助下完成此操作。这看起来像应用于两个图像:

Images with detected lines and points order

接下来,我们要使用线端点作为控制点来执行图像配准。首先,我们确保两个图像中的点彼此对应。我通过使用 convhull 计算凸包来实现这一点, cp2tform 会自动按逆时针顺序对它们进行排序(或者它是相反的方向!)。上面显示的数字表示订单。

最后,我们使用函数 {{3}} 来获取变换矩阵,我们用它来对齐图像并提取平移,旋转和缩放。

以下是完整的代码:

%% # Step 1: read and prepare images
%# (since you provided only one, I created the other by rotating the first).
I1 = imread('http://i.stack.imgur.com/Se6zX.jpg');
I1 = rgb2gray( imcrop(I1, [85   35  445  345]) ); %# Get rid of white border
I2 = imrotate(I1, -10, 'bilinear', 'crop'); %# Create 2nd by rotating 10 degrees

%% # Step 2: detect the cross sign endpoints (sorted in same order)
p1 = getCross(I1);
p2 = getCross(I2);

%% # Step 3: perform Image Registration
%# Find transformation that maps I2 to I1 using the 4 control points for each
t = cp2tform(p2,p1,'affine');

%# Transform I2 to be aligned with I1
II2 = imtransform(I2, t, 'XData',[1 size(I1,2)], 'YData',[1 size(I1,1)]);

%# Plot
figure('menu','none')
subplot(131), imshow(I1), title('I1')
subplot(132), imshow(I2), title('I2')
subplot(133), imshow(II2), title('I2 (aligned)')

%# Recover affine transformation params (translation, rotation, scale)
ss = t.tdata.Tinv(2,1);
sc = t.tdata.Tinv(1,1);
tx = t.tdata.Tinv(3,1);
ty = t.tdata.Tinv(3,2);
scale = sqrt(ss*ss + sc*sc)
rotation = atan2(ss,sc)*180/pi
translation = [tx ty]

这是提取行端点的函数:

function points = getCross(I)
    %# Get edges (simply by thresholding)
    I = imfilter(I, fspecial('gaussian', [7 7], 1), 'symmetric');
    BW = imclearborder(~im2bw(I, 0.5));

    %# Hough transform
    [H,T,R] = hough(BW);

    %# Detect peaks
    P  = houghpeaks(H, 2);

    %# Detect lines
    lines = houghlines(BW, T, R, P);

    %# Sort 2D points in counterclockwise order
    points = [vertcat(lines.point1); vertcat(lines.point2)];
    idx = convhull(points(:,1), points(:,2));
    points = points(idx(1:end-1),:);
end

结果:

Resulting aligned image

scale =
    1.0025
rotation =
   -9.7041
translation =
   32.5270  -38.5021

旋转恢复到几乎10度(有一些不可避免的错误),并且缩放实际上是1(意味着没有缩放)。请注意,上例中有一个转换组件,因为没有围绕十字标记的中心执行旋转。)

答案 1 :(得分:0)

我不确定Hough变换的MATLAB实现是什么,但是线的方向将只是与你的角度成直角(90度或pi / 2弧度)用于首先识别该行。

我希望有所帮助。在网上有很好的Hough变换报道,维基百科是一个很好的起点。