java - 双线性插值

标签 java image scaling interpolation

我得到了这个通过双线性插值缩放图像的代码。我知道这行得通,但我想不通一件事如果近似像素值是一个边缘(边缘我的意思是它在最后一行或最后一列) ) 输入图像中的像素然后我可以得到坐标 (x+1,y+1) 的像素,这应该导致数组索引超出范围错误但没有发生这样的错误,为什么? 代码是:

public int[] resizeBilinearGray(int[] pixels, int w, int h, int w2, int h2) {
    int[] temp = new int[w2*h2] ;
    int A, B, C, D, x, y, index, gray ;
    float x_ratio = ((float)(w-1))/w2 ;
    float y_ratio = ((float)(h-1))/h2 ;
    float x_diff, y_diff, ya, yb ;
    int offset = 0 ;
    for (int i=0;i<h2;i++) {
        for (int j=0;j<w2;j++) {
            x = (int)(x_ratio * j) ;
            y = (int)(y_ratio * i) ;
            x_diff = (x_ratio * j) - x ;
            y_diff = (y_ratio * i) - y ;
            index = y*w+x ;

            // range is 0 to 255 thus bitwise AND with 0xff
            A = pixels[index] & 0xff ;
            B = pixels[index+1] & 0xff ;
            C = pixels[index+w] & 0xff ;
            D = pixels[index+w+1] & 0xff ;

            // Y = A(1-w)(1-h) + B(w)(1-h) + C(h)(1-w) + Dwh
            gray = (int)(
                    A*(1-x_diff)*(1-y_diff) +  B*(x_diff)*(1-y_diff) +
                    C*(y_diff)*(1-x_diff)   +  D*(x_diff*y_diff)
                    ) ;

            temp[offset++] = gray ;                                   
        }
    }
    return temp ;
}

最佳答案

原因是 x_ratioy_ratio 计算不正确。

考虑最后一行的最后一个像素:

i=h2, j=w2 

然后:

x = x_ratio * j = (w-1)/w2 * (w2-1) = (w-1) * (w2-1)/w2 <= w-1
y = y_ratio * i = (h-1)/h2 * (h2-1) = (h-1) * (h2-1)/h2 <= h-1

index = y*w+x <= (h-1)*w + (w-1) < w*h

因此索引总是小于 pixels 数组的大小。


但请注意,这是一个非常肮脏的 hack,会导致不准确的结果,尤其是对于小图像。

您应该按如下方式计算宽/高比:

float x_ratio = ((float)w)/w2;
float y_ratio = ((float)h)/h2;

并创建一个将坐标转换为数组索引的函数 - 我们将其命名为 coord2index。此函数考虑了超出范围的坐标并实现了所谓的边界选项,该选项模拟图像边界外有像素。

边界的常用选项有:

  • 对称 - 图像边界外的像素通过在边界处镜像反射图像来计算。在这种情况下,这可能是最好的可能性。

  • 复制 - 假定图像边界外的像素等于边界处最近的像素。这是最简单的方法。

  • 圆形 - 图像几乎在所有方向上周期性重复。用于一些高级图像处理算法;不适合调整图像大小。

关于java - 双线性插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16341167/

相关文章:

java - Android 中的 "returnRes cannot be resolved to a variable"错误

java - 在 block 注释中使用 Java RegEx 查找和替换模式

excel - 从url获取图片,然后重命名图片

java - android: 自定义 ImageView onDraw 方法无法在 y 轴上正确绘制

ios - 如何缩小 UIImage 并同时使其变得清晰/清晰而不是模糊?

java - 如何从相应的 xsd'S 获取自己的 xml 编辑器的信息?

java - Android:getContext().getContentResolver() 有时会出现 NullPointerException

html - 显示一些图片似乎破坏了 Google 上的样式

c# - 将图像保存到文件

php - 在 Jelastic/PHP 中,单个节点上的多个 cloudlet 是否共享一个文件空间?