我正在寻找一个可用于获取图像与其重新调整大小的版本之间的像素位置映射的特定公式。例如,我想知道使用公式在重新调整大小的版本中来自原始图像的当前像素是什么。即,在行中说,只有来自列j_m,J_n,....的像素存在于重新调整大小的版本中,其余的被消除。我说的是重新调整大小,它只是在没有任何宽高比保持或窗口平均的情况下进行缩放。
由于
答案 0 :(得分:0)
在阅读了所有评论后,我对你想要达到的目标感到困惑,所以你可能想在这个答案中原谅我可能的天真。
基础知识:要缩放图像(信号,函数,任何东西),您应用标准缩放矩阵。此站点不允许正确的LaTeX内联,因此请努力了解以下表示。对于2D图像,缩放矩阵由S = [sx 0; 0 sy]。由于我们对同时执行旋转和平移不感兴趣,因此将此表示移动到齐次坐标没有多大意义。矩阵很简单,非常简单。因此,例如,要将x缩放6倍,将y缩放4倍,S = [6 0; 0 4]。将此矩阵应用于每个点可以得到缩放的图像。以下是此应用程序的直接示例,原始图像并按6x,4y缩放:
如你所见,升级星中有很多空白点。这就是为什么实际上通过逆缩放矩阵执行放大。通常可以得到所提到的矩阵的逆矩阵,并且对应于S-1 = [1 / sx 0; 0 1 / sy]。这样做的好处是插值基本上是执行逆变换的必要步骤,即你有一个离散域并且你得到实际位置,以处理你执行某种插值。以下是最简单的插值:最近邻,将实数截断为整数。缩放因子同样是6x和4y,但是以相反的形式完成:
应该很清楚,您无法完全恢复缩放的图像(即使您知道缩放因子),因为缩放过程可以在插值步骤中自由执行任何操作。但是,您可以直接在缩放图像中直接应用具有反转因子的缩放,以获得未缩放图像的近似值。在这个例子中,我们得到了下面的图像,它恰好与原始图像完全相同。
如果它有帮助,这里是非常简单的Python代码,它举例说明了所讨论的内容。
import sys
from PIL import Image
img = Image.open(sys.argv[1]) # Assumed to be grayscale.
width, height = img.size
scale_x, scale_y = (6, 4)
imo = img.load()
# Upscale directly.
full_img = Image.new('L', (width * scale_x, height * scale_y), 'white')
im = full_img.load()
for x in xrange(width):
for y in xrange(height):
im[x * scale_x, y * scale_y] = imo[x, y]
full_img.save(sys.argv[2])
# Upscale by inverse transform.
full_img = Image.new('L', (width * scale_x, height * scale_y), 'white')
im = full_img.load()
for x in xrange(width * scale_x):
for y in xrange(height * scale_y):
im[x, y] = imo[int(x / float(scale_x)), int(y /
float(scale_y))]
full_img.save(sys.argv[3])
# Downscale the previous upscaled image.
downscaled = Image.new('L', (width, height), 'white')
im2 = downscaled.load()
for x in xrange(width * scale_x):
for y in xrange(height * scale_y):
im2[x/scale_x, y/scale_y] = im[x, y]
downscaled.save(sys.argv[4])