在OpenCV中使用我自己的公式将RGB转换为灰色

时间:2015-07-13 10:24:42

标签: java android opencv opencv4android

我希望将RGB图像转换为格雷,就像这个函数一样:

Imgproc.cvtColor(mRgba, mGrey, Imgproc.COLOR_RGBA2GRAY);

但是openCV使用了一个特定的公式(我认为0.299 * R + 0.587 * G + 0.114 * B?),我想改用min(R,G,B)。

是否有一种性能效率高的方法? (这是用于Android的OpenCV,因此使用Java)

编辑:

以下是我最初应该做的分析:

捕获相机的基本应用程序以12 FPS运行

  • 使用OpenCV的cvtColor():12 FPS(速度差异无关紧要)
  • 与Mark Miller的回答:1.5 FPS
  • 与Mark Miller的回答和Miki的优化(获取数据指针一次):7 FPS

这可能看起来令人难以置信,但只是那个小功能花费了FPS的一半。该设备可以运行非常复杂的东西,如ORB以不错的速率(3-4 FPS),以及所有O(n)C ++例程,没有FPS差异。也只是三木"技巧"使功能快10倍。

1 个答案:

答案 0 :(得分:1)

没有预先构建的方法可以为OpenCV提供任意转换为灰度的功能。剩下的选项是使用RGB通道本身。

for (int x = 0; x < mRgba.cols(); x++)
{
    for (int y = 0; y < mRgba.rows(); y++)
    {
        double[] rgb = mRgba.get(x, y);
        mGray.put(x, y, Math.min(rgb[0], Math.min(rgb[1], rgb[2])));
    }
}

正如您所提到的,它可能太慢,尤其是对于大型图像和来自if语句的分支。但是,有三个优化规则:(1)不要这样做,(2)不要这样做,(3)优先配置。简单地说,首先尝试易于编码的版本,然后一旦你知道这个部分是一个慢的部分[即,通过运行它并计时],改变代码以提高效率。