2016-08-29 55 views
1

我想應用一個imrotate圖像,但圖像的角度是未知的,並隨每個圖像而改變。找到最低和最右邊的像素來找到圖像的角度

如果我已經將圖像轉換爲二進制文件,可以找到最低的y位置'1'和最左邊的'1',並使用它們之間的梯度/角度作爲我的圖像旋轉的角度?

例如: binary positions diagram

使用這兩個位置之間的角度,並與x軸對準它?

目前進展 - 轉換爲二進制和取得的邊緣更容易分辨:

% convert to binary 
greyImage = rgb2gray(C); % greyscale 
cannyImage = edge(greyImage, 'canny'); % canny edge detection 

% fill the gaps in the shape 
se = strel('disk',2); 
bw = imclose(cannyImage, se); 

filled = imfill(bw, 'holes'); 

imshow(filled); 

[~,lowerMostCol] = max(cumsum(sum(filled,2))); 
[~,leftMostRow] = max(sum(filled,1)==1); 
+0

份額你迄今爲止的所作所爲。 – Sachith

+0

@Sachith更新了我目前所在的位置。 –

+0

這是很好的。這將幫助其他人瞭解你迄今爲止做了什麼,並且你會得到最好的答案。 – Sachith

回答

1

方法#1

隨着a爲二進制圖像,你可以做這樣的事情 -

[~,lowermost] = max(cumsum(sum(a,2))); 
lowermostpt = [lowermost,find(a(lowermost,:),1,'first')] 

[~,rightmost] = max(cumsum(sum(a,1))); 
rightmostpt = [find(a(:,rightmost),1,'first'),rightmost] 

[~,topmost] = max(sum(a,2)==1); 
topmostpt = [topmost,find(a(topmost,:),1,'first')] 

[~,leftmost] = max(sum(a,1)==1); 
leftmostpt = [find(a(:,leftmost),1,'first'),leftmost] 

爲了提高效率,最好將總和存儲一次稍後重複使用。

採樣運行 -

a = 
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  1  0  0  0  0  0 
    0  0  0  0  0  0  0  0  1  1  1  0  0  0  0 
    0  0  0  0  0  0  0  1  1  1  1  1  0  0  0 
    0  0  0  0  0  0  1  1  1  1  1  1  1  0  0 
    0  0  0  0  0  1  1  1  1  1  1  1  1  1  0 
    0  0  0  0  0  0  1  1  1  1  1  1  1  0  0 
    0  0  0  0  0  0  0  1  1  1  1  1  0  0  0 
    0  0  0  0  0  0  0  0  1  1  1  0  0  0  0 
    0  0  0  0  0  0  0  0  0  1  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
lowermostpt = 
    12 10 
rightmostpt = 
    8 14 
topmostpt = 
    4 10 
leftmostpt = 
    8  6 

方法2從圖像處理工具箱使用bwboundaries -

idx = cell2mat(bwboundaries(a)) 

[~,p1] = min(idx(:,1)) 
topmostpt = idx(p1,:) 
[~,p2] = max(idx(:,1)) 
lowermostpt = idx(p2,:) 

[~,p3] = min(idx(:,2)) 
leftmostpt = idx(p3,:) 
[~,p4] = max(idx(:,2)) 
rightmostpt = idx(p4,:) 
+0

min(cumsum(sum(a,1)))是否適用於最左邊的? –

+0

@AlexS檢查編輯。 – Divakar

+0

謝謝,現在我有最左邊的列號和最下面的行號,我如何指定該特定位置,並找到兩個位置之間的梯度? 注意:對於要測試的圖像,在最左側和最下側之間始終存在直線邊緣。因此,我選擇了最右邊。 –