图像中的旋转三角形 - MATLAB

时间:2014-11-08 18:35:36

标签: matlab image-processing shape matlab-cvst

我正在编写一个用于在MATLAB中检测基本形状的程序。 当我检测到形状时,我会评估它的方向,然后我旋转形状使其方向为零,然后我可以评估它的投影并指定它是什么。

问题是MATLAB函数:regionprops()没有正确评估三角形的方向。

I = zeros(256,256);
pos_triangle = [64 64 128 192 128 128];
Is = insertShape(I, 'FilledPolygon', pos_triangle);
imshow(Is)

original = Is;

originalBW = im2bw(original);
figure; imshow(originalBW);
S = regionprops(originalBW,'All');

bwr=imrotate(originalBW,S.Orientation);
S2 = regionprops(bwr,'Centroid','Orientation');

figure;imshow(bwr);

我使用imrotate fnc旋转图像,我没有旋转问题,imrotate运行良好。问题在于计算方向[使用' regionprps()' fnc]的形象!例如:我想从这个位置转动三角形

http://postimg.org/image/4un4sc7pn/

取向值:-28.9621 所以我把它旋转28.9621度来改变它的位置到这个

http://postimg.org/image/x68opdrm3/

但输出是这样的:

http://postimg.org/image/yf15or8y3/

使用他们的方向(或图像的其他可能属性)

另一个例子:将位置从左上第二个三角形改为左上第一个三角形

2 个答案:

答案 0 :(得分:2)

这是一种解决方法。请注意:

1)我没有计算机视觉系统工具箱,因此我无法使用insertShape;相反,我使用fill函数在图像中创建三角形,然后使用getframe来获取实际图像。我想这与使用insertShape相同。

2)我使用FilledArea的'regionprops'属性来检测三角形。当有一个形状时,这很容易,但如果有很多形状,你将不得不修改一些代码。

3)我执行的旋转等于-1 * regionprops给出的方向,使其恢复为0.你当然可以改变它。旋转的图像更大,以解释旋转。

以下是代码:

clear
clc
close all

I = zeros(256,256);
pos_triangle = [64 64 128 192 128 128];

xt = [64 128 128];
yt = [64 192 128];

%// Since I don't have the Computer Vision System Toolbox I use 'fill'.
%//Is = insertShape(I, 'FilledPolygon', pos_triangle);
imshow(I)
hold on

fill(xt,yt,'w')
hold off

原始三角形:

enter image description here

%// Create image using getframe.
hFrame = getframe(gca);
original = hFrame.cdata;

originalBW = im2bw(original(:,:,1));

%// Remove border of the image.
originalBW = imclearborder(originalBW);

figure; 

imshow(originalBW);

S = regionprops(originalBW,'FilledArea','Orientation');

%// Find region filled with the most pixels: that's the shape.
[a,b] =max([S.FilledArea]);

%// Get corresponding orientation
Orientation = S(b).Orientation;

%// Rotate by the inverse of the orientation; I'm not sur that's what you
%// want but it looks OK.
bwr=imrotate(originalBW,-1*Orientation);
S2 = regionprops(bwr,'Centroid','Orientation');

figure;imshow(bwr);

旋转的三角形看起来像它的方向是0。:

enter image description here

希望有所帮助!

答案 1 :(得分:0)

我不是图像处理方面的专家,但实现轮换并不难。您唯一需要知道图像中心的东西。在Matlab中,左上角的图像中心。要围绕中心旋转对象,需要将每个点乘以旋转矩阵。让我们围绕图像中心旋转三角形。

clear
clc
close all

I = zeros(256,256);
pos_triangle = [64 64 128 192 128 128];

xt = [64 128 128];
yt = [64 192 128];

a = deg2rad(20);
R = [cos(a)  -sin(a); 
     sin(a)   cos(a)];

p1 = R*[64; 64]
p2 = R*[128; 192]
p3 = R*[128; 128]

% the rotated points
x1 = [p1(1) p2(1) p3(1)];
y1 = [p1(2) p2(2) p3(2)];

imshow(I)
hold on

fill(x1,y1,'r')
fill(xt,yt,'w')
hold off 

结果现在

enter image description here

如果您想将其自身旋转,则需要将图像的中心转换为三角形的中心。这不是一个完整的解决方案,但我希望它有所帮助。