双线性插值的最近邻

Nearest Neighbour to Bilinear Interpolation

我目前正在做一个项目,需要我阅读图像并放大它们。

我目前正在使用最近邻算法来放大我的图像,但我正在尝试使用双线性插值,但发现它很难实现。

这是我目前的NN算法:

public void doThumbnailResize() {
    resizedImage = new BufferedImage(55, 55, BufferedImage.TYPE_3BYTE_BGR); 
    int h = resizedImage.getHeight(), h2 = image1.getHeight();
    int w = resizedImage.getWidth(), w2 = image1.getWidth();
    for (int j = 0; j < h; j++) {
        for (int i = 0; i < w; i++) {
            float y = j * ((float) h2 / (float) h);
            float x = i * ((float) w2 / (float) w);
            resizedImage.setRGB(i, j, image1.getRGB((int) x, (int) y));
        }
    }
    image_icon.setIcon(new ImageIcon(resizedImage));        
}

我发现很难在网上找到 material 并且想知道是否有人可以指出正确的方向以及一些伪代码。

提前致谢。

双线性插值基本上适用于对 4 个像素的正方形进行插值。您首先要寻找最近的邻居,即目标像素映射到哪个源像素,以及相对于该像素的位置。然后创建一个宽度和高度为一个目标像素大小的框,并检查该框与哪些像素相交(最多 4 个)并计算该重叠与框大小的关系。然后该百分比将应用于颜色并添加到最终颜色。

示例:

假设我们有一个像这样的 9x9 图像(每个字符代表一个像素):

ABC
DEF
GHI

现在我们要将其放大到 4x4 并计算第一个像素 (0/0) 的插值:

  • 目标像素的相对大小为(3/4,3/4),即每个目标像素跨越源像素宽度和高度的0.75倍
  • 像素A跨越纹理坐标(0,0)到(0.333,0.333)
  • 我们的第一个目标像素的中心将在 (0.125,0.125) (1/width * 0.5, 1/height * 0.5) 因此目标框将跨越坐标 (0.0, 0.0) 到 (0.25,0.25)
  • 如您所见,我们的第一个目标像素完全位于源像素 A 内,因此获得了 A 的颜色。

现在第二个像素 (1/0):

  • 第二个目标像素的中心位于 (0.375,0.125),因此跨越坐标 (0.25,0.0) 到 (0.5,0.25)
  • 如您所见,这将与源像素 A、B、D 和 E 重叠
  • 我们目标框的面积是0.25 * 0.25 = 0.0625
  • 与A重叠的面积为(0.333-0.25) * (0.25 - 0) ~= 0.02075
  • 因此我们大约 33% 的目标像素框与 A
  • 重叠
  • B 的重叠为 ((0.5-0333) * (0.25 - 0)) / 0.0625 ~= 67%
  • 我们的目标像素的颜色因此是 A 颜色的 33% + B 颜色的 67%

让我们考虑另一个像素,这次 (1/1):

  • A 的重叠为:((0.333 - 0.25) * (0.333 - 0.25)) / 0.0625 ~= 11%
  • B 的重叠为:((0.5-0.333) * (0.333 - 0.25)) / 0.0625 ~= 22%
  • D 的重叠为:((0.333 - 0.25) * (0.5-0.333) ) / 0.0625 ~= 22%
  • E 的重叠为:((0.5-0.333) * (0.5-0.333) ) / 0.0625 ~= 45%
  • 目标像素 (1/1) 的颜色因此为 11% A + 22% B + 22% D + 45% E