需要图像插值帮助

时间:2014-05-30 18:58:32

标签: 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++){
            // 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");
}

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

1 个答案:

答案 0 :(得分:0)

Android API中的Bitmap类(我假设你正在使用的那个)有一个名为createScaledBitmap的静态方法:http://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap%28android.graphics.Bitmap,%20int,%20int,%20boolean%29

此方法的作用是接受已创建的Bitmap,指定最终的宽度和高度尺寸以及名为boolean的{​​{1}}标记。将此设置为filter会进行最近邻插值,而false进行双线性插值。

举个例子,假设你有一个true的二维数组,你可以像这样重新调整一个:

Bitmap

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

通常情况下,如果您缩小图片,则将其设置为filter,而如果您升级,则将其设置为false图片。原因是因为当您将图像从小到大插值时,您尝试创建的信息比最初可用的信息多。使用最近邻居执行此操作将引入块效应,因此双线性插值将有助于平滑此问题。从大到小都没有使用任何一种方法的明显伪影,因此您通常选择最近邻居,因为它的计算效率更高。当你调整到更大的图像时,显然会有模糊。你去的越大,你得到的就越模糊,但是这比你最近邻居的那种阻碍要好。

仅使用Android API,这是您可以获得的最佳和最简单的解决方案。如果你想进入更复杂的插值技术(Cubic,Lanczos等......),不幸的是你必须自己实现它。先试试双线性,看看你得到了什么。