Как измерить угол поворота изображения по сравнению с известным шаблоном
Я преуспел в этом, используя метод ниже, но я уверен, что должны быть другие более эффективные по времени альтернативы, чтобы обеспечить точный угол поворота вместо приближения как метод ниже. Я буду рад услышать ваши отзывы.
Процедура основана на следующих шагах:
- Импортировать изображение шаблона (т.е. с ориентацией в 0º)
- Создайте дискретный массив из того же изображения, но каждый поворачивается на 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.
- Извлеките "test_image", для которого я смотрю под углом по сравнению с образцом изображения, которое мы ранее повернули и сохранили в массив
- Следуйте серии 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)
# ../..
- И, наконец, я выбираю дискретизированный угол, соответствующий образцу изображения, как угол, соответствующий шаблонному изображению с максимальным значением 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 (метод в этой ссылке использует сопоставление пикселей, а не сопоставление объектов, возможно, это быстрее)