Houghlines в MATLAB
После обнаружения линий на изображении с помощью линий Хоу , как я могу использовать его для вычисления изменения угла (поворота) линий опорного изображения?
2 ответа:
Примечание Для читателей: это последующий вопрос, обратитесь к ним для фона:
- Как выбрать максимальную интенсивность в преобразовании Хафа в MATLAB?
- вычисление перемещений перемещается в MATLAB
Этот процесс похож на то, что я показала раньше. Ниже я используюизображения из вашего предыдущего вопроса (поскольку вы предоставили только один, я создал другой, повернув первый на 10 градусов).
Мы начните с обнаружения линий для двух изображений. Мы делаем это с помощью Hough трансформация функции . Вот как это выглядит применительно к обоим изображениям:
Далее мы хотим выполнить регистрацию изображения, используя конечные точки линии в качестве контрольных точек. Во-первых, мы удостоверяемся, что точки соответствуют друг другу на двух изображениях. Я делаю это, вычисляя выпуклую оболочку с помощью
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
С результатом:
scale = 1.0025 rotation = -9.7041 translation = 32.5270 -38.5021
В поворот восстанавливается как почти 10 градусов (с некоторой неизбежной ошибкой), а масштабирование фактически равно 1 (Что означает отсутствие масштабирования). Обратите внимание, что в приведенном выше примере был компонент перевода, поскольку вращение не было выполнено вокруг центра знака креста).
Я не уверен, что такое реализация преобразования Хоу в MATLAB, но ориентация линии будет просто находиться под прямым углом (90 градусов или pi/2 Радиана) к углу, который вы использовали для идентификации линии в первую очередь.
Надеюсь, это поможет. В интернете есть приличное освещение преобразований Хафа, и Википедия-хорошее место для начала.