2

我正在寻找一个特定的公式,该公式可用于获取图像与其重新调整大小的版本之间的像素位置映射。例如,我想知道使用公式调整大小的版本中原始图像的当前像素是多少。即,在行中,只有来自列 j_m、J_n、.... 的像素出现在调整大小的版本中,其余的被消除。我说的是重新调整大小,它只是在不保留任何纵横比或窗口平均的情况下进行缩放。

谢谢

4

1 回答 1

0

阅读完所有评论后,我对您想要实现的目标感到困惑,因此您可能想原谅我在这个答案中可能的幼稚。

基础知识:要缩放图像(信号、函数、任何东西),您可以应用标准缩放矩阵。该站点不允许正确的 LaTeX 内联,因此请努力理解以下表示。对于 2D 图像,缩放矩阵由 S = [sx 0; 0 西]。由于我们对同时执行旋转和平移不感兴趣,因此将这种表示移动到齐次坐标没有多大意义。矩阵很简单,很简单。因此,例如,将 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])
于 2012-12-19T02:16:18.980 回答