Как измерить поворот изображения в MATLAB? - PullRequest
4 голосов
/ 20 сентября 2011

У меня есть два изображения.Один является оригиналом, а другой поворачивается.

Original Image

Теперь мне нужно определить угол поворота изображения.До сих пор я думал об обнаружении центроидов каждого цвета (поскольку у каждого изображения, которое я буду использовать, есть квадраты с цветами), и использовал его, чтобы узнать, насколько изображение было повернуто, но мне не удалось.

Я использую это, чтобы обнаружить центроиды и цвет в верхнем квадрате на изображении:

i = rgb2gray(img);
bw = im2bw(i,0.01);
s = regionprops(bw,'Centroid');
centroids = cat(1, s.Centroid);
colors = impixel(img,centroids(1),centroids(2));
top = max(centroids);
topcolor = impixel(img,top(1),top(2));

Ответы [ 3 ]

3 голосов
/ 26 сентября 2011

Вы можете обнаружить углы одного из цветных прямоугольников как на изображении, так и в повернутой версии, и использовать их в качестве контрольных точек для вывода преобразования между двумя изображениями (как при регистрации изображений), используя CP2TFORM * Функция 1002 *. Затем мы можем вычислить угол поворота из матрицы аффинного преобразования:

Вот пример кода:

%# read first image (indexed color image)
[I1 map1] = imread('http://i.stack.imgur.com/LwuW3.png');

%# constructed rotated image
deg = -15;
I2 = imrotate(I1, deg, 'bilinear', 'crop');

%# find blue rectangle
BW1 = (I1==2);
BW2 = imrotate(BW1, deg, 'bilinear', 'crop');

%# detect corners in both
p1 = corner(BW1, 'QualityLevel',0.5);
p2 = corner(BW2, 'QualityLevel',0.5);

%# sort corners coordinates in a consistent way (counter-clockwise)
p1 = sortrows(p1,[2 1]);
p2 = sortrows(p2,[2 1]);
idx = convhull(p1(:,1), p1(:,2)); p1 = p1(idx(1:end-1),:);
idx = convhull(p2(:,1), p2(:,2)); p2 = p2(idx(1:end-1),:);

%# make sure we have the same number of corner points
sz = min(size(p1,1),size(p2,1));
p1 = p1(1:sz,:); p2 = p2(1:sz,:);

%# infer transformation from corner points
t = cp2tform(p2,p1,'nonreflective similarity');    %# 'affine'

%# rotate image to match the other
II2 = imtransform(I2, t, 'XData',[1 size(I1,2)], 'YData',[1 size(I1,1)]);

%# recover affine transformation params (translation, rotation, scale)
ss = t.tdata.Tinv(2,1);
sc = t.tdata.Tinv(1,1);
tx = t.tdata.Tinv(3,1);
ty = t.tdata.Tinv(3,2);
translation = [tx ty];
scale = sqrt(ss*ss + sc*sc);
rotation = atan2(ss,sc)*180/pi;

%# plot the results
subplot(311), imshow(I1,map1), title('I1')
hold on, plot(p1(:,1),p1(:,2),'go')
subplot(312), imshow(I2,map1), title('I2')
hold on, plot(p2(:,1),p2(:,2),'go')
subplot(313), imshow(II2,map1)
title(sprintf('recovered angle = %g',rotation))

screenshot

1 голос
/ 20 сентября 2011

Я бы взял вариант вышеупомянутого подхода:

% Crude binarization method to knock out background and retain foreground
% features. Note one looses the cube in the middle
im = im > 1

Enter image description here

Тогда я получу 2D автокорреляцию:

acf = normxcorr2(im, im);

Enter image description here

Исходя из этого результата, можно легко обнаружить пики, и, когда вращение переносится в область функции автокорреляции (ACF), можно определить вращение путем сопоставления пиков между исходным ACF и ACF из повернутого изображения, например. используя так называемый венгерский алгоритм .

1 голос
/ 20 сентября 2011

Если вы можете определить цвет, соответствующий только одному компоненту, проще:

  1. Рассчитать центроиды для каждого изображения
  2. Рассчитать среднее значение центроидов (в х иу) для каждого изображения.Это «центр» каждого изображения
  3. Получите центроид красного цвета компонента (в вашем примере) для каждого изображения
  4. Вычтите среднее значение центроидов для каждого изображения из центроида красного компонента цветадля каждого изображения
  5. Рассчитайте ArcTan2 для каждого из векторов, рассчитанных в 4), и вычтите углы.Это твой результат.

Если у вас более одной фигуры каждого цвета, вам нужно рассчитать все возможные комбинации для вращения, а затем выбрать ту, которая совместима с другими возможными вращениями.

Я мог бы опубликовать код в Mathematica , если вы считаете, что это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...