2016-08-29 31 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

谢谢,现在我有最左边的列号和最下面的行号,我如何指定该特定位置,并找到两个位置之间的梯度? 注意:对于要测试的图像,在最左侧和最下侧之间始终存在直线边缘。因此,我选择了最右边。 –