l具有不同大小的图像:(94,102),(42,62),(67,27),(23,21),(23,17)。所有字符都位于图像的中心,其余字符为黑色或白色。我想将图像标准化为(32,32)
以下是我的数据样本的链接:https://drive.google.com/open?id=0B-QJnh0Uw96lbFVHbVBPclhycFk
答案 0 :(得分:2)
您希望通过为每个图像单独计算的缩放系数来均匀缩放图像。如果您采用较长的维度并将其除以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
然后你只需要调整图像大小。我必须承认,我实际上并不熟悉您所拥有的图像处理功能。然而,它的要点是:
(paddingBefore, 0)
上绘制,否则您需要在位置(0, paddingBefore)
上绘制它。我使用过的大多数图形框架都允许您指定“源”和“目标”矩形,因此源矩形将为(0, 0)-(width, height)
,而您的dest矩形的大小为(scaledWidth, scaledHeight)
,并且上述原点,取决于图像是更宽还是更高。