进行插值运算时索引超出数组边界

##问题描述
为什么我的最邻近插值算法,只能将图像处理为2倍大小?
包括其他算法也都显示不能超过原图像数组大小?
想请问一下您有没有什么好的解决方法呢?

十分感谢!

img

img

该回答引用ChatGPT
根据您提供的代码,可能是因为 resizeFactor 变量的值限制了图像的最大缩放比例。在代码中,resizeFactor 变量用于控制图像的缩放比例,变量的值越大,图像就缩小得越多。在最邻近插值算法中,每个输出像素都只是从输入图像中的最近邻像素取得。这种算法通常会导致输出图像出现锯齿状边缘(也称为“马赛克”效应)。

如果您希望可以将图像缩放到超过原始大小,您可以尝试使用其他的图像缩放算法,如双线性插值或双立方插值等。这些算法可以使用 MATLAB 中的内置函数 imresize 来实现。例如,使用以下代码将图像缩放到 4 倍大小:

originalImage = imread('image.png');
resizedImage = imresize(originalImage, 4, 'bicubic');

其中,imread 函数用于读取原始图像,imresize 函数用于将图像缩放到 4 倍大小,并使用双立方插值算法来处理。您可以尝试修改第二个参数以控制缩放比例,并尝试使用不同的插值算法。

以下答案引用自GPT-3大模型,请合理使用:

。

在进行最邻近插值算法时,只能处理原图像中存在的像素,而不能处理不存在的像素。由于新生成的图像大小变为原图像的2倍,会引入新的像素,此时最邻近插值算法无法处理该像素,从而只能将输出图像大小改变为原图的两倍。

要解决此问题,可以使用双线性插值算法来处理新出现的像素,其代码如下:

//双线性插值算法
for (int i = 0; i < outputImage.width; i++) {
    for (int j = 0; j < outputImage.height; j++) {
 
        //计算在输入图片中的坐标
        float x = i / scale;
        float y = j / scale;
 
        //计算落入的四分之一矩形的范围
        int lx = floor(x);
        int ux = ceil(x);
        int ly = floor(y);
        int uy = ceil(y);
 
        //计算权重值
        float diffX = x - lx;
        float diffY = y - ly;
        float weight1 = (1 - diffX) * (1 - diffY);
        float weight2 = diffX * (1 - diffY);
        float weight3 = (1 - diffX) * diffY;
        float weight4 = diffX * diffY;
 
        //计算插值
        float red = inputImage.data[lx][ly].r * weight1 + 
                     inputImage.data[ux][ly].r * weight2 +
                     inputImage.data[lx][uy].r * weight3 +
                     inputImage.data[ux][uy].r * weight4;
        
        float green = inputImage.data[lx][ly].g * weight1 + 
                     inputImage.data[ux][ly].g * weight2 +
                     inputImage.data[lx][uy].g * weight3 +
                     inputImage.data[ux][uy].g * weight4;
                     
        float blue = inputImage.data[lx][ly].b * weight1 + 
                     inputImage.data[ux][ly].b * weight2 +
                     inputImage.data[lx][uy].b * weight3 +
                     inputImage.data[ux][uy].b * weight4; 
        
        //写入输出图片中
        outputImage.data[i][j].r = red;
        outputImage.data[i][j].g = green;
        outputImage.data[i][j].b = blue;
    }
}

如果我的回答解决了您的问题,请采纳我的回答