2012-12-18 22 views
2

我正在寻找某个可用于获取图像与其重新缩小版本之间像素位置映射的公式。例如,我想知道在使用公式重新调整大小的版本中原始图像中的当前像素是多少。即在行中,我只有列j_m,J_n,...中的像素出现在重新调整大小的版本中,其余部分被删除。我正在谈论的是重新调整大小,只是缩放而没有任何纵横比保持或窗口平均。与图像及其重新缩小版本之间的映射

感谢

+1

你知道缩放因子吗? – mmgp

+0

当我看标签,它实际上似乎是简单的情况:) – Sam

+0

@mmgp是我知道比例因子 – user39576

回答

0

阅读所有的意见后,我正好要达到什么样的困惑,所以你可能要原谅我可能在的naiveness这个答案。

基本知识:缩放图像(信号,函数,任何东西)时应用标准缩放矩阵。本网站不允许正确的LaTeX内联,因此请尽量理解以下表示。对于2D图像,缩放矩阵由S = [sx 0; 0 sy]。由于我们对同时进行旋转和平移不感兴趣,因此将这种表示移动到齐次坐标并没有太多意义。矩阵很简单,非常简单。因此,例如,要将x乘以因子6,y乘以因子4,S = [6 0; 0 4]。将这个矩阵应用到每个点都会提供缩放图像。以下是此应用中,原始图像的一个直接的例子,并通过6倍缩放一个,4Y:

enter image description here     enter image description here

正如你看到的,也有按比例放大的明星有很多空白点。这就是为什么实际上通过逆比例缩放矩阵来执行放大。所提到的矩阵的倒数是平凡地获得的,并且对应于S-1 = [1/s×0; 0 1/sy]。这样做的好处是,插值基本上是执行逆变换的必要步骤,即您有一个离散的域,并且您获得真实的位置,以处理您执行某种插值。以下是最简单的插值法:通过将实数值截断为整数来实现最近邻居。缩放倍率是,再次,6X和4Y,但在逆形式完成:

enter image description here

应该清楚,你可以不完全恢复缩放后的图像(即使你知道的缩放因子)因为缩放过程可以自由地在插值步骤中进行任何操作。但是,您可以直接在缩放的图像中使用反转因子直接应用缩放,以获得未缩放图像的近似值。在这个例子中,我们得到了下面的图像,它恰好与原始图像完全相同。

enter image description here

如果有帮助,在这里是很简单的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]) 
+0

谢谢。想象一下,我拥有大明星的白色形象。然后,我将那个像素位置进行混洗,以获得与白色星形图像不相似的图像。然后,我要重新将缩小后的尺寸缩小。然后,通过应用反向洗牌,我怎么能够得到一个图像,这相当于将原始白色星星的大小应用而不洗牌?我希望你明白我的意思。 – user39576

+0

你的输入是巨星,'f'和缩放因子('sx','sy')。现在让我们假设你在'f'中用象素'b'交换象素'a'。然后你用'sx','sy'缩减'f'。在这个转换之后,像素'a'以像素'b'位置结束,反之亦然。现在你想用'b'来“解除”a'。这是你的疑问/疑问吗?如果你知道如何在'f'中完成混洗,并且如果这些点是在没有内插的情况下进行变换的,那么你只需考虑反比例因子即可解除混杂。在理解了答案中的转换之后,这应该很清楚。 – mmgp

+0

我试图实现它,但我得到的结果不是正确的重新调整版本。我想我要么错过了某些东西,要么映射不能正常工作 – user39576