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

标签 java opencv android

我想像这个函数一样将 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(速度差异微不足道)
  • 马克·米勒的答案:1.5 FPS
  • 根据 Mark Miller 的回答和 Miki 的优化(获取数据指针一次):7 FPS

这可能看起来令人难以置信,但只是这个小功能就花费了一半的 FPS。该设备仍然可以以不错的速率(3-4 FPS)运行非常复杂的东西,例如 ORB,并且所有 O(n) C++ 例程都没有 FPS 差异。而且,Miki 的“技巧”使该函数速度提高了 10 倍。

最佳答案

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

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) 首先进行概要分析。简而言之,首先尝试易于编码的版本,然后一旦您确定此部分是缓慢的部分[即,通过运行它并计时],就可以更改代码以提高效率。

关于java - 使用我自己在 OpenCV 中的公式将 RGB 转换为灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31380849/

相关文章:

java - 3D 高度图地形和碰撞检测

Android磁力计采样率改进/抖动减少

java - 使用正则表达式捕获非连续文本。我该怎么做?

java - 从 String 中删除空格,然后转换为 XML

python-3.x - 将图像放在另一个图像之上的更有效方法 - OpenCV Python3

c++ - 如何计算 OpenCV 中图像中的提示数?

python - 如何在 Visual Studio 2017 中将包添加到 python

android - authTokenType 到底是什么意思?

android - 我如何查看从 http post 调用返回的 json?

java - 从 Java 的 CXF 服务获取 WS-Addressing 数据