使用Hough lines检测到图像中的线条后,如何使用它计算参考图像的线条角度(旋转)的变化?MATLAB中的Houghlines
2
A
回答
3
注意,以飨读者:这是一个后续问题,请参阅以下背景:
- How to select maximum intensity in Hough transform in MATLAB?
- Calculating displacement moved in MATLAB
这个过程类似于我之前展示过。下面我使用的是the images from your previous question(因为您只提供了一个,我通过旋转10度创建了另一个)。
我们从检测两张图像的行开始。我们在Houghtransformfunctions的帮助下做到这一点。这是什么样子应用到图片:
接下来,我们要使用线路端点作为控制点进行图像配准。首先,我们确保两个图像中的点相互对应。我这样做是通过使用convhull
计算凸包来实现的,它会按照逆时针顺序(或者它是在相反的方向!)自动排序它们。上面显示的数字表示顺序。
最后,我们使用函数cp2tform
来获得转换矩阵,我们用它来对齐图像并提取平移,旋转和缩放。
下面是完整的代码:
%% # 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
与结果:
scale =
1.0025
rotation =
-9.7041
translation =
32.5270 -38.5021
旋转恢复为接近10度(有一些不可避免的错误),并且缩放实际上是1(意味着没有缩放)。请注意,在上例中有翻译组件,因为旋转不是在十字中心附近执行的)。
0
我不确定什么MATLAB Hough变换的实现是,但线的方向将简单地与您用来识别的角度成直角(90度或pi/2弧度)该行在第一位。
我希望有帮助。在网络上有很好的霍夫变换报道,维基百科是一个很好的开始。
相关问题
- 1. Opencv HoughLines Lines Theta?
- 2. 与cv :: HoughLines的负距离?
- 3. 行与houghlines平行opencv + python
- 4. 霍夫空间CV2 houghlines
- 5. MATLAB:不能通过houghlines来检测即使是简单的线条?
- 6. RHO的说明和HoughLines THETA参数
- 7. 绘制cv :: HoughLines检测到的线条
- 8. 在HoughLines(opencv)之前Canny有什么用?
- 9. Python cv2 HoughLines网格线检测
- 10. cv :: gpu :: HoughLines无法正常工作
- 11. Android OpenCV - 从Houghlines检测曲线
- 12. 将垂直HoughLines画到某个交点
- 13. 用houghLines估计偏斜程度
- 14. 提高HoughLines的水平线检测(Python的,OpenCV的)
- 15. Houghlines没有检测到一个简单的矩形的顶线
- 16. cv :: iOS上的HoughLines失败,'OpenCV错误:断言失败'
- 17. houghLines没有检测到正确的线条。如何纠正?
- 18. 如何使用OpenCV houghlines来统计屏幕截图中的标签数量?
- 19. Python如何用HoughLines和OpenCV检测图像中的垂直和水平线?
- 20. 为什么我用opencv和houghlines得到这个错误?
- 21. 从cv2.HoughLines获得rho和theta混合票。
- 22. 无法重现使用HoughLines来自OpenCV进行蟒蛇
- 23. MATLAB中的'meshgrid'C
- 24. Matlab中的heapsort
- 25. Matlab中的FindPeaks
- 26. Matlab的:在Matlab
- 27. Matlab:在matlab中的滚动函数
- 28. MATLAB编码器和MATLAB中的parfor R2014b
- 29. 使用MATLAB中的regexprep去除MATLAB
- 30. MatLab中
您好, 想问一下翻译的数字是什么意思?像素数已移动?我试图放大到像素级别,并计算移动的像素,但它不符合。谢谢。非常感谢你的帮助。 – Veronica
完成图像配准后,我们最终得到仿射变换矩阵,从中提取旋转和平移。现在正如我在最后提到的那样,翻译必须发生在创建第二个图像的过程中,因为旋转不是与十字标记中心相关的。您是否尝试将此过程应用于您的实际图像?此外,在这种情况下,我们最终只对我们成功恢复的旋转部分感兴趣(-9.7度,几乎10)! – Amro
你好,我确实在我的实际图片上尝试了这个过程。由于我的图像也是旋转的,因此它不在十字标记的中心,我还需要翻译它。谢谢! – Veronica