我通过使用下面的方法取得了成功,但我确信必须有其他更省时的替代方案来提供精确的旋转角度,而不是下面的方法的近似值。我很高兴听到您的反馈意见。
该程序基于以下步骤:
# 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数组上的不同通道。
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)
# ../..
事实证明这很有效,因为根据旋转模板图像的数量,所得到的精度基于高/低精度的近似值,以及旋转模板数量增加时所需的上升时间......
我确信必须有其他基于不同方法的更智能的替代品,例如生成图像的“方向矢量”,并将结果数字与样本模板中先前已知的数字进行比较......
您的反馈将受到高度赞赏。
答案 0 :(得分:0)
我认为你的问题没有一个简单的解决方案。它实际上是一个注册问题,翘曲(在这种情况下,旋转)图像以适应另一个。这是一个已知的难题,因为细分是。
我听说图像处理研究人员说,掌握分割和注册的人掌握了图像处理功能,这可能有点夸张,但它给出了一般的想法。
无论如何,你的技术就是我如何使用它。关注研究门,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(此链接中的方法使用像素匹配而不是功能匹配,也许它更快)