Как измерить угол поворота изображения по сравнению с известным шаблоном

Я преуспел в этом, используя метод ниже, но я уверен, что должны быть другие более эффективные по времени альтернативы, чтобы обеспечить точный угол поворота вместо приближения как метод ниже. Я буду рад услышать ваши отзывы.

Процедура основана на следующих шагах:

  1. Импортировать изображение шаблона (т.е. с ориентацией в 0º)
  2. Создайте дискретный массив из того же изображения, но каждый поворачивается на 360º/ вращается по сравнению с его ближайшим соседом (то есть: от 30 до 50 повернутых изображений)

# python 3 / opencv 3

# Settings:
rotate_steps = 36
step_angle = round((360/rotate_steps), 0) # one image at each 10º

# Rotation function
def rotate_image(image, angle):
# ../..
return rotated_image

# Importing a sample image and creating a n-dimension array where to store images in:
image = cv2.imread('sample_image.png')
image_Array = np.zeros((image.shape[1], image.shape[0], 1), dtype='uint8')

# Rotating sample image and saving it into the array as a new channel:
while rotation_angle <= (360 - step_angle):
                           angles.append(rotation_angle)
                           image_array[:,:,channel] = rotate_image(image.copy(), rotation_angle)
# ../..

Итак, я получаю:

углы = [0, 10,0, 20,0, 30,0, .../..., 340,0, 350,0]

image_array = [image_1, image_2, image_3,...] где image_i - это другой канал в массиве Numpy.

  1. Извлеките "test_image", для которого я смотрю под углом по сравнению с образцом изображения, которое мы ранее повернули и сохранили в массив
  2. Следуйте серии cv2.matchTemplate() и cv2.minMaxLoc(), чтобы найти угол поворота изображения, который лучше всего соответствует "test_image"

for i in range(len(angles)):
  res = cv2.matchTemplate(test_image, image_array[:,:,i], cv2.TM_CCOEFF_NORMED)
  min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  # ../..

  1. И, наконец, я выбираю дискретизированный угол, соответствующий образцу изображения, как угол, соответствующий шаблонному изображению с максимальным значением max_val.

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

Я уверен, что должны быть другие более разумные альтернативы, основанные на различных методах, таких как генерация своего рода "вектора ориентации" изображения и сравнение только полученного числа с ранее известным числом из образца шаблона...

Ваши отзывы будут высоко оценены.

1 ответ

Я думаю, что у вашей проблемы нет простого решения. На самом деле это проблема регистрации, деформации (в данном случае, поворота) изображения для подгонки под другое. И это известная трудная проблема, как и сегментация.

Я слышал, что исследователи обработки изображений говорят, что "тот, кто владеет сегментацией и регистрацией, владеет обработкой изображений", что может быть немного гиперболой, но это дает общее представление.

Во всяком случае, ваша техника, как я бы пошел с этим. Глядя на страницу исследований, https://www.researchgate.net/post/How_can_one_determine_the_rotation_angle_between_two_images, вы найдете множество ответов. В качестве альтернативы можно использовать сопоставление функций, но я не уверен, что это будет быстрее, чем ваше решение.

Может быть, вы можете взглянуть на методы регистрации OpenCV http://docs.opencv.org/trunk/db/d61/group__reg.html (метод в этой ссылке использует сопоставление пикселей, а не сопоставление объектов, возможно, это быстрее)

Другие вопросы по тегам