【问题标题】:Algorithm RGB to Gray Lagging算法 RGB 到灰色滞后
【发布时间】:2017-08-02 02:37:12
【问题描述】:

试图实现将图片从RGB转换为灰度的转换方法。 当我使用我的方法并在 ImageView 中显示渲染时,它会滞后很多,当我使用 OpenCV 库中的 cvtColor 函数时,它就像一个魅力。 谁能解释一下问题出在哪里? 这是我的方法:

public void RGBToGray(Mat m){
    for(int i = 0; i < m.rows(); i++){
        for(int j = 0; j < m.cols(); j++){
            double[] pix = m.get(i, j);
            pix[0] = pix[1] = pix[2] = (0.21)*pix[0]+(0.72)*pix[1]+(0.07)*pix[2];
            m.put(i, j, pix);
        }
    }
}

【问题讨论】:

  • 您缺乏 OpenCV 中 cvtColor 实现的并行化和矢量化。最重要的是,每次迭代都有两个函数调用——IIRC 这将涉及 JNI,因此会产生一些相关的开销(如果不是每个图像一个调用,每个像素都有两个调用,那么就会变得更加明显。
  • 您对m.getm.put 的调用将消耗大量时间。请注意,ITU(国际电信联盟)将等式定义为 Grey = 0.299Red + 0.587Green + 0.114Blue,根据我的经验,它非常有效。
  • 真的,考虑到你使用的是Mat,这个for循环没有什么理由。 OpenCV 提供了将Mat 拆分为单个通道optimized operations to multiply whole Mat by a scalar 的方法,以及将它们相加并将通道合并为多通道Mat
  • 好的,所以避免 m.get 和 m.put 会解决它,但是如果没有这些功能,我将如何实现算法呢? ,我的意思是将一个垫子分成两个矩阵,应用一个比例然后合并它们,这些操作是如何工作的?不是通过for循环来修改每个像素吗?
  • 类似split,3x scaleAdd 到单个通道“灰色”Mat。如果您需要结果为 3 个通道,那么 merge(将相同的“灰色”Mat 3 次插入输入 List)、mixChannelscvtColor 中的任何一个都可以完成这项工作。 |其他选项是使用get 一次获取所有像素的数组并执行循环。

标签: java opencv optimization colors lag


【解决方案1】:

根据 Dan Masek 的评论,对于那些将看到该帖子的人来说,这是解决方案:

public static void RGBToGray2(Mat m){
    ArrayList<Mat> sousMatrices = new ArrayList<Mat>();
    Core.split(m, sousMatrices);
    Mat result = new Mat();
    Core.addWeighted(sousMatrices.get(0), 0.21, sousMatrices.get(1), 0.72, 0, result);
    Core.addWeighted(sousMatrices.get(2), 0.07, result, 1 ,0 , result);
    sousMatrices.set(0,result);
    sousMatrices.set(1,result);
    sousMatrices.set(2,result);
    Core.merge(sousMatrices, m);
}

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 2019-11-27
    • 2013-01-10
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多