如何为灰度图像创建一种颜色"在Android上使用opencv的应用程序

时间:2015-02-22 01:03:56

标签: android opencv google-glass

以下是使用Opencv(适用于Google Glass)的Android应用中的一小段代码。我试图将图像(位置picturePath)从彩色转换为灰度,然后覆盖原始彩色图像。就目前而言,这段代码将图像保存在内存中,应该是半灰度,一半是全黑的:

private void rGBProcessing (final String picturePath, Mat image) {
    //BitmapFactory Creates Bitmap objects from various sources,
    //including files, streams, and byte-arrays
    Bitmap myBitmapPic = BitmapFactory.decodeFile(picturePath);
    image = new Mat(myBitmapPic.getWidth(), myBitmapPic.getHeight(), CvType.CV_8UC4);
    Mat imageTwo = new Mat(myBitmapPic.getWidth(), myBitmapPic.getHeight(), CvType.CV_8UC1);
    Utils.bitmapToMat(myBitmapPic, image);
    Imgproc.cvtColor(image, imageTwo, Imgproc.COLOR_RGBA2GRAY);
    //Highgui.imwrite(picturePath, imageTwo);
    Utils.matToBitmap(imageTwo, myBitmapPic);

    FileOutputStream out = null;
    try {
        out = new FileOutputStream(picturePath);
        myBitmapPic.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
        // PNG is a lossless format, the compression factor (100) is ignored
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

任何人都可以向我解释为什么所产生的图像在一半上是完全黑的,并建议我进行修正。在我看来,由于图像处理的过程已经部分完成,或许在下一个代码开始之前有一段代码没有完成的问题?任何帮助表示赞赏。 干杯!

更新:这是我所看到的: enter image description here

谷歌眼镜上的图片是黑色的,但这个上传只是切断了下半部分。不久之后,即使应用程序不再出现在屏幕上(我也不知道如何停止调试,所以它仍然可以在后台工作。然后我得到完整的灰度图像。有人可以解释发生了什么,请给我一个潜在的解决方案吗?

1 个答案:

答案 0 :(得分:0)

图像的Alpha通道可能会链接到RGB值。有两种不同的方式可以考虑透明度:

  1. 传统Alpha混合,将透明度定义为:

    • RGB指定对象的颜色
    • Alpha指定它有多坚固。

    数学:blend(source, dest) = (source.rgb * source.a) + (dest.rgb * (1 - source.a))
    在这个世界中,RGB和alpha是独立的。你可以改变一个而不影响另一个。即使对象完全透明,它仍然具有相同的RGB,就像它是不透明的一样。

  2. 预乘Alpha混合

    • RGB指定对象对场景的贡献程度
    • Alpha指定它隐藏了多少背后隐藏的东西

    数学:blend(source, dest) = source.rgb + (dest.rgb * (1 - source.a))
    在这个世界中,RGB和alpha是相互关联的。要使对象透明,您必须减少其RGB(以减少颜色)以及它的alpha(以减少其背后的任何内容)。完全透明的对象不再具有任何RGB颜色,因此只有一个值表示100%透明度=> RGB和alpha全为零与您的情况一样。

  3. OpenCV bitmapToMat()提供了将预乘Alpha混合转换为常规Alpha混合的机会。尝试使用:
    Utils.bitmapToMat(myBitmapPic, image, true);


    只需注释:bitmapToMat()如果需要,可以重新分配输出Mat对象,因此它可能为空。所以如果image,你不应该关心分配。