如何测量图像与已知模板的旋转角度

时间:2016-12-12 17:11:31

标签: python opencv3.0 matchtemplate

我通过使用下面的方法取得了成功,但我确信必须有其他更省时的替代方案来提供精确的旋转角度,而不是下面的方法的近似值。我很高兴听到您的反馈意见。

该程序基于以下步骤:

  1. 导入模板图像(即:方向为0º)
  2. 创建一个相同图像的离散数组,但每个图像以360º/ rotateteps旋转,与其最近邻居相比(即:30到50个旋转图像)
  3. # 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'
    3. 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”最高值对应的模板图像。
      2. 事实证明这很有效,因为根据旋转模板图像的数量,所得到的精度基于高/低精度的近似值,以及旋转模板数量增加时所需的上升时间......

        我确信必须有其他基于不同方法的更智能的替代品,例如生成图像的“方向矢量”,并将结果数字与样本模板中先前已知的数字进行比较......

        您的反馈将受到高度赞赏。

1 个答案:

答案 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(此链接中的方法使用像素匹配而不是功能匹配,也许它更快)