我有卡的裁剪圖像:Matlab的 - 旋轉卡
該卡是圓角的矩形,是顏色鮮豔,並坐在一個比較暗的背景。因此,很容易區分屬於卡片的像素和屬於背景的像素。
我想使用MATLAB來旋轉卡,使其側面是垂直和水平(而不是對角線),並創建一張除拉直卡之外什麼都沒有的圖像。
我需要這對任何合理的卡角工作(比如+45到-45度初始卡旋轉)。
這樣做的最好方法是什麼?
謝謝!
我有卡的裁剪圖像:Matlab的 - 旋轉卡
該卡是圓角的矩形,是顏色鮮豔,並坐在一個比較暗的背景。因此,很容易區分屬於卡片的像素和屬於背景的像素。
我想使用MATLAB來旋轉卡,使其側面是垂直和水平(而不是對角線),並創建一張除拉直卡之外什麼都沒有的圖像。
我需要這對任何合理的卡角工作(比如+45到-45度初始卡旋轉)。
這樣做的最好方法是什麼?
謝謝!
您可以通過查找卡片邊緣所做的線條來做到這一點。旋轉角度就是其中一條線和水平線(或垂直線)之間的角度。
在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變換的黑白圖像,與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')
然後,你將不得不裁剪。
這樣做的最好方法是實際編寫代碼,而不是在這裏傾倒你的問題,希望有人出現併爲你編碼。 – Adriaan
[如何拉直圖像中的傾斜正方形?]中的答案(https://stackoverflow.com/questions/39506759/how-to-straighten-a-tilted-square-shape-in-an-image)將無法用於該圖像,因爲卡的角落是圓形的。 –