【问题标题】:Matlab - rotate a card [duplicate]Matlab - 旋转卡片[重复]
【发布时间】:2017-05-24 17:23:38
【问题描述】:

我有一张卡片的裁剪图像:

卡片是一个圆角矩形,颜色鲜艳,位于相对较暗的背景上。 因此,很容易区分属于卡片的像素和属于背景的像素。

我想使用 MATLAB 旋转卡片,使其侧面垂直和水平(而不是对角线),并创建一个只有拉直卡片的图像。

我需要它来处理任何合理的卡片角度(比如初始卡片旋转 +45 到 -45 度)。

最好的方法是什么?

谢谢!

【问题讨论】:

标签: matlab image-processing rotation geometry rectangles


【解决方案1】:

您可以通过查找卡片边缘的线条来做到这一点。旋转的角度就是其中一条线与水平(或垂直)之间的角度。

在 MATLAB 中,您可以使用霍夫线检测器在二值图像中查找线。

0。读取输入图像

我下载了你的图片并将其重命名为 card.png。

A = imread('card.png');

我们不需要颜色信息,所以转换成灰度。

I = rgb2gray(A);

1.检测图像中的边缘

一个简单的方法是使用Canny edge detector。调整阈值以拒绝噪声和弱边缘。

BW = edge(I, 'canny', 0.5);

显示检测到的边缘。

figure
imshow(BW)
title('Canny edges')

2。使用霍夫线检测器

首先,您需要对黑白图像使用霍夫变换,并使用hough 函数。调整分辨率,以便以后检测到所有需要的线条。

[H,T,R] = hough(BW, 'RhoResolution', 2);

其次,通过使用houghpeaks在霍夫变换中找到峰值来找到图像中最强的线条。

P = houghpeaks(H, 100); % detect a maximum of 100 lines

第三,检测带有houghlines的行。

lines = houghlines(BW, T, R, P);

显示检测到的线条以确保您至少在卡片边缘找到一条。图像中黑色背景周围的白色边框使检测右边缘变得更加困难。

figure
imshow(A)
hold on
for k = 1:length(lines)
  xy = [lines(k).point1; lines(k).point2];
  plot(xy(:,1), xy(:,2), 'LineWidth', 2, 'Color', 'red');
end
title('Detected lines')

3.计算旋转角度

lines(3) 是卡片的左侧垂直边缘。 lines(3).point2 是位于底部的行的结尾。我们希望这个点保持在原来的位置,但我们希望沿线向量化以与向量v = [0 -1]' 对齐。 (原点是图片的左上角,x 水平向右,y 垂直向下。)

lines(3)

ans = 

  struct with fields:

    point1: [179 50]
    point2: [86 455]
     theta: 13
       rho: 184

只需计算向量u = lines(3).point1 - lines(3).point2与垂直向量v之间的角度。

u = lines(3).point1 - lines(3).point2; % vector along the vertical left edge.
v = [0 -1]; % vector along the vertical, oriented up.
theta = acos( u*v' / (norm(u) * norm(v)) );

角度以弧度为单位。

4.旋转

imrotate 函数可让您通过以度为单位指定角度来旋转图像。您还可以将imwarp 与旋转变换一起使用。

B = imrotate(A, theta * 180 / pi);

显示旋转后的图像。

figure
imshow(B)
title('Rotated image')

那么你就必须裁剪它。

【讨论】:

  • 有没有办法订购霍夫线?
猜你喜欢
  • 2013-01-04
  • 2012-02-20
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2011-03-29
  • 2012-03-13
相关资源
最近更新 更多