使用OpenCV进行RGB到LMS色彩空间转换

时间:2016-02-27 15:23:17

标签: java opencv rgb

我有一个问题,了解我如何正确使用我的矩阵类型进行从rgb到lms颜色空间的opencv颜色转换。我发现的论文是here。我想要做的只是计算lms颜色三元组如下:

Mat actRGBVec = new Mat(1,3,Imgproc.COLOR_RGB2BGR);
Mat lmsResVec = new Mat(1,3,CvType.CV_64FC3);

lmsMat = new Mat(inputImg.rows(),inputImg.cols(),CvType.CV_64FC3);

// iterate through all pixels and multiply rgb values with the lms transformation matrix
try {
  for (int x = 0; x < inputImg.rows(); x++) {
    for (int y = 0; y < inputImg.cols(); y++) {
      actRGBVal = inputImg.get(x, y);

      // vector holding rgb info
      actRGBVec.put(0, 0, actRGBVal);
      Core.gemm(lmsTransformMat, actRGBVec, 1, null, 0, lmsResVec, 0);

      lmsMat.put(x, y, lmsResVec.get(0, 0));
    }
  }
}
catch (Exception e) {
  Log.d("ImageHandler","Error rgb to lms conversion! " + e.getMessage());
}

lmsMat的类型为CV_64FC3。 inputImg的类型为Imgproc.COLOR_RGB2BGR。 lmsTransformMat的类型为CV_64FC1(因为它只包含标量值,这应该是正确的类型?)。

异常说:错误rgb到lms转换!空值 我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

确保所有矩阵的尺寸和类型都正确无误:

  • inputImage不能是Imgproc.COLOR_RGB2BGR类型。这是一个用于cvtColor函数的常量,而不是OpenCV矩阵类型。由于您的输入图像可能是彩色图像,因此可以生成正确的类型CV_8UC3
  • lmsTransformMat应为CV_64FC1类型的3x3矩阵。
  • actRGBVec需要是与lmsTransformMat相同类型的3x1矩阵。 (再次:Imgproc.COLOR_RGB2BGR不是矩阵类型)。
  • lmsResVec需要是与lmsTransformMat相同类型的3x1矩阵。 (但您可以使用new Mat()。OpenCV会在Core.gemm)中处理它。
  • lmsMat看起来不错。

此外,您将null作为src3参数传递给Core.gemm。这是NullPointerException的原因。由于您的beta参数为0,因此您只需提供new Mat()而不是null