Rotate a Matrix by Finding an Axis

4 ビュー (過去 30 日間)
Pedro Sousa
Pedro Sousa 2018 年 12 月 31 日
コメント済み: Walter Roberson 2019 年 1 月 2 日
Hey, sorry to bother but I 'm having issues in a project. Long story short, I must find an axis on the 2D binary matrix (which is done by finding the maximum distance between two of the black points in the matrix) and then rotate said image to make it as straight as possible. I cannot use imrotate though I guess that part can be done with a rotation matrix and so, is pretty easy (still don't know how it works but I can look into that).
If anyone can help me at finding the axis please, it'd be most aprecciated. However, I do understand it is quite the unusual task.
Anyway, thank you and have yourself a jolly new year's eve.

採用された回答

Bruno Luong
Bruno Luong 2019 年 1 月 2 日
Here is the code to find the largest distance between 2 white pixels.
Once finding it you can compute the angle and rotate the image (left as exercice)
largestdistance.png
% Generate test image data
Im = peaks(1000)>0.5;
% Find the largest distance of *white* pixels
[y,x] = find(Im);
K = convhull(x,y);
xk = x(K);
yk = y(K);
i2 = 1;
nk = length(K);
d2max = -Inf;
for i1=1:nk
xk_i1 = xk(i1);
yk_i1 = yk(i1);
d2 = (xk(i2)-xk_i1).^2+(yk(i2)-yk_i1).^2;
while true
i2temp = mod(i2,nk) + 1;
d2temp = (xk(i2temp)-xk_i1).^2+(yk(i2temp)-yk_i1).^2;
if d2temp <= d2
break
end
d2 = d2temp;
i2 = i2temp;
end
if d2 >= d2max
i1max = i1;
i2max = i2;
d2max = d2;
end
end
% Here are the pair of white pixels with largest size
x1 = xk(i1max);
y1 = yk(i1max);
x2 = xk(i2max);
y2 = yk(i2max);
% Graphical check
figure(1);
clf
imagesc(Im);
axis equal
hold on
plot([x1 x2],[y1 y2],'r-o')

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2018 年 12 月 31 日
find an axis on the 2D binary matrix (which is done by finding the maximum distance between two of the black points in the matrix) and then rotate said image to make it as straight as possible.
Those are not inherently compatible objectives.
Consider for example,
A
+
B+++++++++++++++++++++++++++++++++++++++++++++++++
Now the maximum distance between two of the black points is between A and B, so you would identify AB or BA as your axes. You would then rotate so that AB was the horizontal or vertical axes, which would require that the long line was at an angle. That disagrees with your requirement to "make it as straight as possible".
Once you have identified the angle of your axes, using atan2(dy, dx) then you can use makehgtform to construct a transform matrix, which you can then use to rotate your points. That will tell you the new location for the points... but the new locations are unlikely to be integral, so you need to figure out how you want to handle that to create a new image.
  3 件のコメント
Pedro Sousa
Pedro Sousa 2019 年 1 月 2 日
My real issue is finding the most distant black points in the 2d binary matrix and making that an axis to be used after that.
Walter Roberson
Walter Roberson 2019 年 1 月 2 日
Are you looking for connected distance or euclidean distance ?

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeImages についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by