【问题标题】:OpenCV Rotation with warpAffine in Python Causes Erroneous BorderPython中使用warpAffine的OpenCV旋转导致错误的边界
【发布时间】:2017-08-02 16:51:55
【问题描述】:

查看此 Python 代码:

degrees = 90
center  = (24, 24)

img     = np.ones((48,48,3)) * 255
mat     = cv2.getRotationMatrix2D(center, degrees, 1.0)
img     = cv2.warpAffine(img, mat, (48, 48))

我的期望是创建一个 3 通道、完全饱和的白色正方形并将其存储在 img 中。之后,它将旋转 90 度。将一个白色正方形旋转 90 度应该会导致......一个无法区分的白色正方形。但是当我:

plt.imshow(img)
plt.show(img)

我看到一个错误的黑色边框:

有什么方法可以让warpAffine 按预期工作,即旋转图像而没有错误的边框?我尝试了以下修改无济于事:

center  = (23, 23)
center  = (24, 23)
center  = (23, 24)
center  = (25, 25)
center  = (24, 25)
center  = (25, 24)

【问题讨论】:

  • 在轮换之前展示它会是什么样子?干净的?另外,如果你给它一个奇数的像素尺寸并且实际上可以选择中心像素作为你的中心会发生什么?
  • 在旋转之前,它是预期的干净正方形。不幸的是,我无法更改图像尺寸,因为在上面的虚拟示例中它是一张白色图像——但我的实际数据集是 CT 扫描,我试图在其中维护尺寸信息。
  • 你试过旋转大约 24.5,24.5 吗?看起来 getRotationMatrix2D 接受 Point2f 所以它应该采用浮点数
  • @EastonBornemeier (23.5, 23.5) 将是中心,索引从 0 到 47(含)。
  • @AlexanderReynolds 很好,这就是我的意思,使用图像的实际中心

标签: python-3.x opencv image-rotation


【解决方案1】:

您应该使用图像的确切中心,而不是下一个最接近的东西。使用 (24,24) 旋转稍微偏离中心。

由于getRotationMatrix2D 接受Point2f,您应该以(23.5,23.5) 的形式通过中心,因为它是0 and 47 之间的中点。

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多