【问题标题】:How can l rescale images to a standard size?如何将图像调整为标准尺寸?
【发布时间】:2017-08-20 18:29:32
【问题描述】:

我有不同尺寸的图像:(94,102)、(42,62)、(67,27)、(23,21)、(23,17)。所有字符都在图像的中心,其余的都是黑色或白色。我想将图像标准化为 (32, 32)

这是我的数据示例的链接:https://drive.google.com/open?id=0B-QJnh0Uw96lbFVHbVBPclhycFk

【问题讨论】:

标签: image python-3.x opencv image-processing computer-vision


【解决方案1】:

您希望通过为每个图像单独计算的缩放因子统一缩放图像。如果您将较长的维度除以 32 (32.0 / max(width, height)),那么您将得到一个可以乘以宽度和高度的数字。

scale = 32.0 / max(width, height)
scaledWidth = round(width * scale, 0)
scaledHeight = round(height * scale, 0)

这会让您走到一半,因为较大的尺寸现在是 32 - 较小的尺寸可能小于 32。因此,您需要在较小的尺寸中填充图像以弥补差异。你垫多少?好吧,总填充将是32 - min(scaledWidth, scaledHeight)。你想把一半放在一边,一半放在另一边。一个潜在的问题是它可能是奇数个像素 - 一种简单的处理方法是将一半放在一侧,其余放在另一侧。

totalPadding = 32 - min(scaledWidth, scaledHeight)
paddingBefore = math.floor(totalPadding / 2) # <-- "half" before
paddingAfter = totalPadding - paddingBefore  # <-- "the rest" after

然后你只需要调整图像的大小。我必须承认,我实际上不熟悉您可以使用的图像处理功能。但是,它的要点是:

  1. 创建一个 32x32 的新图像。
  2. (可选)如果您想确保扩展背景与原始图像的背景相同,因为您提到它将是黑色或白色,然后用您在坐标 (0) 处找到的相同颜色填充 32x32 图像, 0) 的原始图像。
  3. 将原始图像绘制到新图像中,指定您要调整它的大小。您需要确定图像是纵向还是横向 - 如果是纵向,那么您想在位置 (paddingBefore, 0) 处绘制它,否则您想在位置 (0, paddingBefore) 处绘制它。我使用过的大多数图形框架都允许你指定一个“源”和一个“目标”矩形,所以你的源矩形将是(0, 0)-(width, height),你的目标矩形的大小将是(scaledWidth, scaledHeight),并且在上面描述的原点,具体取决于图片是更宽还是更高。

【讨论】:

  • @Gilbert,感谢您的澄清。我仍然有点困惑,或者我没有完全理解你的解释。在指令 'paddingAfter = totalPadding - paddingBefore' 之后,我将图像大小调整为 (32, 32) ?我放了一个指向我的数据样本的链接
  • 我不知道该怎么解释。我在帖子末尾包含了具体步骤。第一步是创建一个目标图像,将调整后的数据放入其中,它具体说是创建一个 32x32 图像。这就是您最终获得 32x32 图像的方式。第三步是使用正在使用的成像库的“绘制缩放图像”功能将提供的图像适合 32x32 框。它引用了前面解释的计算。
猜你喜欢
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2015-06-11
  • 2017-05-21
相关资源
最近更新 更多