Houghlines в MATLAB

После обнаружения линий на изображении с помощью линий Hough, как я могу использовать его для расчета изменения по углу (повороту) линий эталонного изображения?


person Veronica    schedule 14.01.2010    source источник


Ответы (2)


Примечание для читателей. Это дополнительный вопрос. См. предысторию:


Процесс аналогичен тому, что я показывал ранее. Ниже я использую изображения из вашего предыдущего вопроса (поскольку вы предоставили только один, я создал другой, повернув первый на 10 градусов).

Начнем с определения линий для двух изображений. Мы делаем это с помощью Hough трансформировать функции. Вот как это выглядит применительно к обоим изображениям:

Изображения с обнаруженным порядком линий и точек

Затем мы хотим выполнить регистрацию изображения, используя конечные точки линии в качестве контрольных точек. Во-первых, мы убеждаемся, что точки соответствуют друг другу на двух изображениях. Я делаю это, вычисляя выпуклую оболочку, используя convhull< /strong>, который автоматически сортирует их в порядке против часовой стрелки (или в обратном направлении!). Цифры, показанные выше, указывают порядок.

Наконец, мы используем функцию cp2tform чтобы получить матрицу преобразования, которую мы используем для выравнивания изображений и извлечения перемещения, поворота и масштабирования.

Ниже приведен полный код:

%% # Step 1: read and prepare images
%# (since you provided only one, I created the other by rotating the first).
I1 = imread('http://i.stack.imgur.com/Se6zX.jpg');
I1 = rgb2gray( imcrop(I1, [85   35  445  345]) ); %# Get rid of white border
I2 = imrotate(I1, -10, 'bilinear', 'crop'); %# Create 2nd by rotating 10 degrees

%% # Step 2: detect the cross sign endpoints (sorted in same order)
p1 = getCross(I1);
p2 = getCross(I2);

%% # Step 3: perform Image Registration
%# Find transformation that maps I2 to I1 using the 4 control points for each
t = cp2tform(p2,p1,'affine');

%# Transform I2 to be aligned with I1
II2 = imtransform(I2, t, 'XData',[1 size(I1,2)], 'YData',[1 size(I1,1)]);

%# Plot
figure('menu','none')
subplot(131), imshow(I1), title('I1')
subplot(132), imshow(I2), title('I2')
subplot(133), imshow(II2), title('I2 (aligned)')

%# 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);
scale = sqrt(ss*ss + sc*sc)
rotation = atan2(ss,sc)*180/pi
translation = [tx ty]

А вот функция, которая извлекает конечные точки строк:

function points = getCross(I)
    %# Get edges (simply by thresholding)
    I = imfilter(I, fspecial('gaussian', [7 7], 1), 'symmetric');
    BW = imclearborder(~im2bw(I, 0.5));

    %# Hough transform
    [H,T,R] = hough(BW);

    %# Detect peaks
    P  = houghpeaks(H, 2);

    %# Detect lines
    lines = houghlines(BW, T, R, P);

    %# Sort 2D points in counterclockwise order
    points = [vertcat(lines.point1); vertcat(lines.point2)];
    idx = convhull(points(:,1), points(:,2));
    points = points(idx(1:end-1),:);
end

с результатом:

Результирующее выровненное изображение

scale =
    1.0025
rotation =
   -9.7041
translation =
   32.5270  -38.5021

Поворот восстанавливается почти на 10 градусов (с некоторой неизбежной ошибкой), а масштаб фактически равен 1 (что означает отсутствие масштабирования). Обратите внимание, что в приведенном выше примере был компонент перевода, потому что вращение не выполнялось вокруг центра знака креста).

person Amro    schedule 17.01.2010
comment
Здравствуйте, хотелось бы спросить, что означают цифры для перевода? Количество перемещенных пикселей? Я попытался увеличить масштаб до уровня пикселей и рассчитать количество перемещенных пикселей, но это не соответствует. Спасибо. Был бы очень признателен за вашу помощь. - person Veronica; 02.02.2010
comment
После выполнения части регистрации изображения мы получаем матрицу аффинного преобразования, из которой мы извлекаем вращение и перемещение. Теперь, как я упомянул в конце, перевод, должно быть, произошел в процессе создания второго изображения, так как вращение происходит не по отношению к центру крестика. Вы пытались применить этот процесс к своим реальным изображениям? Кроме того, в данном случае нас в конечном счете интересует только та часть вращения, которую мы успешно восстановили (-9,7 градуса, почти 10)!! - person Amro; 03.02.2010
comment
Здравствуйте, я попробовал этот процесс на своих реальных изображениях. Поскольку мои изображения также повернуты так, что они не находятся вокруг центра креста, мне также понадобится его перевод. Спасибо! - person Veronica; 04.02.2010

Я не уверен, какова MATLAB реализация преобразования Хафа, но ориентация линии будет просто находиться под прямым углом (90 градусов или пи/2 радиана) к углу, который вы использовали для определения линии в первую очередь.

Надеюсь, это поможет. Преобразования Хафа хорошо освещены в Интернете, и Википедия — хорошее место для начала.

person Tom Duckering    schedule 14.01.2010