理解最近邻图像大小调整算法

时间:2014-02-06 18:31:57

标签: image algorithm

我正在阅读nearest-neighbor interpolation并且不确定我是否理解它是如何工作的。以下是对算法的正确解释吗?假设我们想要将图像拉伸3倍,从2乘2大小的图像到6乘6:

Map every pixel value in the old image to its location in the resized image. 
Refer to these as 'landmarks'.
 - For example, (0,0) -> (0,0)
                (0,1) -> (0,3) 
                ...
Starting at (0,1), for every pixel in the resized image that doesn't have a value,
assign to that pixel the value of the closest landmark. 

这是对的吗?

1 个答案:

答案 0 :(得分:0)

我将对你的'地标'的定位做一个小调整。不要把第一个放在(0,0),而是把它放在(1,1):

_ _ _ _ _ _
_ x _ _ x _
_ _ _ _ _ _
_ _ _ _ _ _
_ x _ _ x _
_ _ _ _ _ _

x标记地标,_字符是未定义的像素 我们现在有(1,1),(1,4),(4,1)和(4,4)的地标。我们如何知道原始图像中的哪些像素与这些地标相对应?最简单的方法是使用整数除法除以比例因子,在本例中为3:

1 div 3 = 0
4 div 3 = 1

我们现在可以将每个地标像素映射到原始图像中的相应像素:

landmark    original
  (1,1)  =>   (0,0)
  (1,4)  =>   (0,1)
  (4,1)  =>   (1,0)
  (4,4)  =>   (1,1)

现在,如果我们在调整大小的图像中尝试使用其他像素会发生什么?如果我们采用像素(2,3),我们可以确定哪个像素在原始图像中最接近?那么,

2 mod 3 = 0
3 mod 3 = 1

因此原始图像中的相应像素为(0,1)。这是与我们的地标(1,4)相对应的相同像素,因此必须是我们最近的邻居。我们使用新像素调整大小的图像将如下所示:

_ _ _ _ _ _
_ x _ _ x _
_ _ _ _ _ _
_ _ @ _ _ _
_ @ _ _ x _
_ _ _ _ _ _

我更改了新像素的符号以及也与地标(0,1)到@对应的地标像素。
但是我们计算了与我们的新像素相对应的原始位置而没有任何参考地标,所以我们真的需要这个地标吗?好吧,不,我们不。我们所要做的就是使用整数除法(或地板或截断或任何编程语言调用它;但不是圆形)将每个像素坐标除以缩放因子。这给了我们以下伪代码:

Input:  Original[][] - the original image as a 2-dimensional array
        k - the scalar scaling factor
Output: Resized[][] - the resized image

for all elements (i,j) in Resized
    Resized[i][j] := Original[i div k][j div k]
end

实际上,如果使用浮点除法和truncate / floor,则可以将其扩展为接受非整数缩放因子> = 1.