Python:scikit-image 库中的ski.transform.warp 无法按预期工作

问题描述 投票:0回答:1

我最近开始尝试一些图像处理,并且对该领域相对较新。 我不明白为什么在使用 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)
python opencv image-processing computer-vision scikit-image
1个回答
0
投票

我最终发现了问题(感谢 Christoph Rackwitz 的及时建议)。

参考下图,

在第一阶段,红点是由用户输入的。 此阶段的 y 轴向上移动时沿正方向增大(如下图所示)。

在第二阶段,当向下移动时,y 轴在正方向上增加(如第一张图所示)。因此,红点被绘制为蓝点,随后导致使用图像的该部分进行扭曲操作。

因此,要恢复到最初想要的点,我只需要反转 y 坐标即可

src[:, 1] = img.height - src[:, 1]

希望这对其他人在处理不同阶段和条件下的图像时有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.