2017-05-24 52 views
0

我有卡的裁剪圖像:Matlab的 - 旋轉卡

card

該卡是圓角的矩形,是顏色鮮豔,並坐在一個比較暗的背景。因此,很容易區分屬於卡片的像素和屬於背景的像素。

我想使用MATLAB來旋轉卡,使其側面是垂直和水平(而不是對角線),並創建一張除拉直卡之外什麼都沒有的圖像。

card

我需要這對任何合理的卡角工作(比如+45到-45度初始卡旋轉)。

這樣做的最好方法是什麼?

謝謝!

+0

這樣做的最好方法是實際編寫代碼,而不是在這裏傾倒你的問題,希望有人出現併爲你編碼。 – Adriaan

+0

[如何拉直圖像中的傾斜正方形?]中的答案(https://stackoverflow.com/questions/39506759/how-to-straighten-a-tilted-square-shape-in​​-an-image)將無法用於該圖像,因爲卡的角落是圓形的。 –

回答

0

您可以通過查找卡片邊緣所做的線條來做到這一點。旋轉角度就是其中一條線和水平線(或垂直線)之間的角度。

在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') 

Canny edges

2.使用霍夫線檢測

首先,您需要使用Hough變換的黑白圖像,與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') 

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') 

Rotated image

然後,你將不得不裁剪。