我最近开始尝试一些图像处理,并且对该领域相对较新。 我不明白为什么在使用 python scikit-image 库中的以下代码进行简单的投影变换时会得到意外的结果。
# TRANSFORM
imgGray = cv2.cvtColor(cv2.imread(imgPath), cv2.COLOR_BGR2GRAY)
dst = np.array([[1000, 100],
[1000, 200],
[800, 200],
[800, 100]])
src = np.array([[500, 0],
[500, 200],
[0, 200],
[0, 0]])
tform3 = ski.transform.ProjectiveTransform()
tform3.estimate(src, dst)
tf_img_warp = ski.transform.warp(imgGray, tform3, output_shape=(200, 500))
## PLOT
plt.figure(num=None, figsize=(8, 6), dpi=80)
fig, ax = plt.subplots(1,2, figsize=(15, 10), dpi = 80)
ax[0].set_title(f'Original', fontsize = 15)
ax[0].imshow(imgGray)
ax[0].set_axis_off()
ax[1].set_title(f'Transformed', fontsize = 15)
ax[1].imshow(tf_img_warp)
ax[1].set_axis_off()
patch1 = Circle((dst[0][0],dst[0][1]),
10, facecolor = color)
patch2 = Circle((dst[1][0],dst[1][1]),
10, facecolor = color)
patch3 = Circle((dst[2][0],dst[2][1]),
10, facecolor = color)
patch4 = Circle((dst[3][0],dst[3][1]),
10, facecolor = color)
patch5 = Circle((src[0][0],src[0][1]), 10,
facecolor = color)
patch6 = Circle((src[1][0],src[1][1]), 10,
facecolor = color)
patch7 = Circle((src[2][0],src[2][1]), 10,
facecolor = color)
patch8 = Circle((src[3][0],src[3][1]), 10,
facecolor = color)
ax[0].add_patch(patch1)
ax[0].add_patch(patch2)
ax[0].add_patch(patch3)
ax[0].add_patch(patch4)
ax[1].add_patch(patch5)
ax[1].add_patch(patch6)
ax[1].add_patch(patch7)
ax[1].add_patch(patch8)
通过重用上面的代码,结果有时看起来不错,例如
其他时候,结果似乎以意想不到的方式改变了图像,例如从下面的原始图像中,我们可以看到要变换的选定区域的左上角有一些黑色瓷砖和一些白色斑块。
但是,转换的输出似乎改变了这种模式。
据我们所知,一些黑色瓷砖以及左上角的白色斑点都消失了。我曾多次尝试检查是否有任何愚蠢的错误,但我发现没有一个错误导致了这个意外的结果。
输出图像没有被裁剪,从图块的行数和列数可以看出与原始图像中选定的区域相同。
任何图像处理大师可以帮助这个新手理解发生了什么吗?我彻底傻眼了。谢谢!
编辑 p/s:我也尝试过使用opencv的透视变换。但结果也是一样的。
M = cv2.getPerspectiveTransform(src, dst)
imgWarp = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]), flags=cv2.INTER_LINEAR)
imgWarp = Image.fromarray(imgWarp)