近邻取样插值法的幽灵事件

当通过近邻取样插值法对图片进行缩放的时候, 目标图像的每个像素都来源于原图像的对应位置像素. 这可能会造成意想不到的后果.考虑如下图片, 该图像似乎并没有什么特别, 但对该图像进行缩放时:

img

import PIL.Image

im = PIL.Image.open('/img/jp_ghost.bmp')
im = im.resize((im.size[0] // 2, im.size[1] // 2), PIL.Image.NEAREST)
im.show()

长宽均缩放 1/2 后的图片如下:

img

原图变成了一张颜色为 (99, 97, 101) 的纯色图片.

分析

在使用近邻取样插值法缩放的时候, 原图中特定的像素点将组合成新的图片. 因此只需要控制原图中的特定位置的像素点, 就能控制缩放后生成的图像.

将原图放大, 观察到如下结构, 可以看到大量规则排列的 (99, 97, 101) 像素点覆盖了整个原图. 当缩放至 1/2 时, 这些像素点被取出并组合成了新的图像. 其中 (99, 97, 101) 是原图的图像均值.

img

注: 生成幽灵图片的代码如下:

import PIL.Image
import PIL.ImageStat

im = PIL.Image.open('/img/jp.jpg')
mean = PIL.ImageStat.Stat(im).mean
mean = tuple(int(e) for e in mean)

for x in range(im.size[0] // 2):
    for y in range(im.size[1] // 2):
        im.putpixel((2 * x + 1, 2 * y + 1), mean)

im.show()