2

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

ответ

3

Примечание для читателей: Это дополнительный вопрос, обратитесь к ним на фоне:


Этот процесс аналогичен тому, что Я показал раньше. Ниже я использую the images from your previous question (так как вы предоставили только один, я создал другую, повернув первую на 10 градусов).

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

Images with detected lines and points order

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

Наконец, мы используем функцию 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 

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

Resulting aligned image

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

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

+0

Здравствуйте, Хотелось бы спросить, что означают цифры для перевода? Число перемещенных пикселей? Я попытался увеличить изображение до уровня пикселей и вычислить перемещенные пиксели, но он не подсчитывается. Благодарю.Был бы очень признателен за вашу помощь. – Veronica

+0

После выполнения части регистрации изображения мы заканчиваем матрицей аффинного преобразования, из которой мы извлекаем поворот и перевод. Теперь, как я упоминал в конце, перевод должен был произойти в процессе создания второго изображения, так как вращение не относится к центру поперечного знака. Вы пытались применить этот процесс к своим реальным изображениям? Кроме того, в этом случае нас интересует только часть вращения, которую мы успешно восстановили (-9,7 градуса, почти 10) !! – Amro

+0

Здравствуйте, я попробовал этот процесс на своих реальных изображениях. Поскольку мои изображения также повернуты так, что это не вокруг центра креста, мне также понадобится его перевод. Благодаря! – Veronica

0

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

Я надеюсь, что это поможет. В Сети есть достойное освещение преобразований Хафа, и Википедия - хорошее место для начала.

Смежные вопросы