Java 图像插值需要帮助

Java 图像插值需要帮助,java,android,image-processing,Java,Android,Image Processing,我正试图弄清楚如何使用我的热传感器来改变覆盖在Android摄像头上的颜色。问题是我得到的数据是在一个16x4的数组中。如何将此16x4网格调整为不同的分辨率?例如32x8、48x12…等 编辑: 例如,我的绘图方法是: public void onDraw(Canvas canvas){ super.onDraw(canvas); for(int x = 0; x < 4; x++){ for(int y = 0; y < 16; y++){

我正试图弄清楚如何使用我的热传感器来改变覆盖在Android摄像头上的颜色。问题是我得到的数据是在一个16x4的数组中。如何将此16x4网格调整为不同的分辨率?例如32x8、48x12…等

编辑: 例如,我的绘图方法是:

public void onDraw(Canvas canvas){
    super.onDraw(canvas);

    for(int x = 0; x < 4; x++){
        for(int y = 0; y < 16; y++){
            // mapping 2D array to 1D array
            int index = x*GRID_WIDTH + y;
            tempVal = currentTemperatureValues.get(index);
            // 68x68 bitmap squares to display temperature data
            if(tempVal >= 40.0)
                bitmaps[x][y].eraseColor(Color.RED);
            else if(tempVal < 40.0 && tempVal > 35.0)
                bitmaps[x][y].eraseColor(Color.YELLOW);
            else
                bitmaps[x][y].eraseColor(Color.BLUE);
        }
    }

    combinedBitmap = mergeBitmaps();

    // combinedBitmap = fastblur(combinedBitmap,  45);
    paint.setAlpha(alphaValue);
    canvas.drawBitmap(combinedBitmap, xBitmap, yBitmap, paint);

    Log.i(TAG,"Done drawing");
}
public void onDraw(画布){
super.onDraw(帆布);
对于(int x=0;x<4;x++){
对于(int y=0;y<16;y++){
//将二维阵列映射到一维阵列
int index=x*网格宽度+y;
tempVal=currentTemperatureValues.get(索引);
//用于显示温度数据的68x68位图方块
如果(临时值>=40.0)
位图[x][y]。擦除颜色(颜色.红色);
否则如果(tempVal<40.0&&tempVal>35.0)
位图[x][y]。擦除颜色(颜色.黄色);
其他的
位图[x][y].橡皮擦颜色(Color.BLUE);
}
}
combinedBitmap=合并位图();
//combinedBitmap=fastblur(combinedBitmap,45);
paint.setAlpha(α值);
画布.drawBitmap(组合位图、xBitmap、yBitmap、绘画);
日志i(标记“完成图纸”);
}

当前的实现是在我的相机预览上绘制一个16x4的覆盖图,但是分辨率非常低,我想尽我所能改进它。

Android API中的
位图
类(我假设您正在使用)有一个名为
createScaledBitmap
的静态方法:

此方法的作用是接受已创建的
位图
,指定最终的宽度和高度尺寸以及名为
过滤器
布尔
标志。将其设置为
false
执行最近邻插值,而
true
执行双线性插值

例如,假设您有一个由
位图
组成的2D数组,您可以这样调整其中一个数组的大小:

Bitmap resize = Bitmap.createScaledBitmap(bitmaps[x][y], 32, 8, true);
第一个参数是要调整大小的
位图
,第二个参数是宽度,第三个参数是高度,最后一个参数是
过滤器
标志。输出(当然)存储在
resize
中,是您调整大小/缩放的图像。目前,这个方法的Javadoc(如您所见)没有解释
filter
的作用。我必须查看Android的源代码,才能弄清楚它到底在做什么,而且还要根据我以前使用过的方法的经验

通常,如果要缩小图像,则将其设置为
false
;如果要放大图像,则将其设置为
true
。原因是,当您从小到大插值图像时,您试图创建比最初可用的信息更多的信息。使用最近邻进行此操作将引入块效应,因此双线性插值将有助于平滑此现象。无论使用哪种方法,从大到小都不会产生明显的伪影,因此您通常会选择最近邻,因为它计算效率更高。当你调整到一个更大的图像时,会有明显的模糊。你走得越大,你得到的模糊度就越高,但这比你和最近的邻居之间的障碍要好


对于仅使用Android API而言,这是您可以获得的最好、最简单的解决方案。如果您想学习更复杂的插值技术(立方体、Lanczos等),不幸的是,您必须自己实现。先试试双线性,看看你能得到什么。

请展示一些我们可以使用的代码。没有你提供的更多信息,你不可能知道从哪里开始回答。@Thomassmyte:你需要进一步的帮助吗?