OpenCV仿射变换不会发挥作用

时间:2016-05-08 12:01:35

标签: python image opencv image-processing

我尝试使用支点进行基本的仿射变换。

import cv2
import numpy as np
import PIL
import matplotlib.pyplot as plt

img = cv2.imread('earth.png')
img_pivots = cv2.imread('earth_keys.png')
map_img = cv2.imread('earth2.png')
map_pivots = cv2.imread('earth2_keys.png')

pts_img_R = np.transpose(np.where(img_pivots[:, :, 2] > 0 ))
pts_img_G = np.transpose(np.where(img_pivots[:, :, 1] > 0 ))
pts_img_B = np.transpose(np.where(img_pivots[:, :, 0] > 0 ))
pts_img = np.vstack([pts_img_R, pts_img_G, pts_img_B])
pts_map_R = np.transpose(np.where(map_pivots[:, :, 2] > 0 ))
pts_map_G = np.transpose(np.where(map_pivots[:, :, 1] > 0 ))
pts_map_B = np.transpose(np.where(map_pivots[:, :, 0] > 0 ))
pts_map = np.vstack([pts_map_R, pts_map_G, pts_map_B])

M = cv2.estimateRigidTransform(pts_map.astype(np.float32), pts_img.astype(np.float32), True)

dst = cv2.warpAffine(map_img,M,(img.shape[1], img.shape[0]))

plt.subplot(121),plt.imshow(img),plt.title('earth.png')
plt.subplot(122),plt.imshow(dst),plt.title('earth2.png transrofmed')
plt.show()

在这两张照片上,我制作了3个点(R,G& B)并将它们保存在单独的图像中(' earth_keys.png'用于' earth.png'和' ; earth2_keys.png' for' earth2.png')。我想要的只是匹配' earth2.png'使用枢轴点' earth.png'。

尽管如此,改造后我得到的只是这个 enter image description here

我假设我错误地放了一些论点或类似的东西,但我尝试了所有组合并得到了所有类型的错误结果,但仍然无法发现它。

Example images (with pivots)

编辑: 将枢轴数改为6

仍然是错误的转型 enter image description here

M现在等于

 array([[  4.33809524e+00,   8.28571429e-01,  -5.85633333e+02],
   [ -6.22380952e+00,  -1.69285714e+00,   1.03468333e+03]])

Example with 6 pivots

1 个答案:

答案 0 :(得分:6)

您对您的支点有多大信心?

如果我在你的图像上绘制它们,我会得到这个: Plotting points

在手动叠加之后,会给出看起来像你的结果: Manual superposition

如果我手动定义3个对应点,我得到这个:

pts_img = np.vstack([[68,33],   [22,84],  [113,87]] )
pts_map = np.vstack([[115,101], [30,199], [143,198]])

Result for manual points

它仍然不完美,但它可能更接近你想要达到的目标。

总而言之,我建议您检查计算关键点的方式,如果有疑问,建议您进行手动叠加