OpenCV仿射变换不会执行

ark*_*khy 7 python opencv image 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()
Run Code Online (Sandbox Code Playgroud)

在两张图像上,我制作了3个点(R,G和B)并将它们保存在单独的图像中('earth_keys.png'表示'earth.png'而'earth2_keys.png'表示'earth2.png').我想要的是将'earth2.png'上的枢轴点与'earth.png'上的枢轴点相匹配.

不过,改造后我得到的只是这个 在此输入图像描述

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

示例图像(带枢轴)

编辑:将枢轴编号更改为6

还是错误的转型 在此输入图像描述

M现在等于

 array([[  4.33809524e+00,   8.28571429e-01,  -5.85633333e+02],
   [ -6.22380952e+00,  -1.69285714e+00,   1.03468333e+03]])
Run Code Online (Sandbox Code Playgroud)

示例有6个枢轴

Gwe*_*wen 6

你对自己的支点有多大信心?

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

在手动叠加之后,这给出了一些看起来像你的结果: 手动叠加

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

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

手动点的结果

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

最后,我建议您检查计算关键点的方式,如有疑问,请进行手动叠加.