c++ - 我怎样才能在 OpenCV 中写 float 图像

标签 c++ c opencv


有人给了我这个功能:

Mat tan_triggs_preprocessing(InputArray src, float alpha = 1, float gamma = 10.0,
                 float tau = 1000.0, int sigma1 = 2) {
  Mat X = src.getMat();
  Mat I, tmp, tmp2;
  double meanI;

  X.convertTo(X, CV_32FC1);
  pow(X, gamma, I);

  meanI = 0.0;
  pow(abs(I), alpha, tmp);
  meanI = mean(tmp).val[0];
  I = I / pow(meanI, 1.0/alpha);

  meanI = 0.0;
  pow(min(abs(I), tau), alpha, tmp2);
  meanI = mean(tmp2).val[0];
  I = I / pow(meanI, 1.0/alpha);

  for(int r = 0; r < I.rows; r++) {
    for(int c = 0; c < I.cols; c++) {
      I.at<float>(r,c) = tanh(I.at<float>(r,c) / tau);
    }
  }
  I = tau * I;

  return I;
}

函数输入为灰度图或CV_8UC1类型,输出为CV_32FC1类型的矩阵。我所知道的是该功能使输入图像更亮,增加了对比度。当我使用 imshow 函数显示图像时,我可以非常清楚地看到 tan_triggs_preprocessing 的输出,实际上与源图像相比,输出更亮,对比度更高。但问题是当我使用 imwrite 函数将它保存为图像格式(例如 JPG)时,它完全是黑色的。我什么也看不见。
我检查了输出中元素的值,发现它们的值在 [0.06.., 2.3...] 之间。这是我的问题,希望你能帮助我,非常感谢。

  1. 我可以将 CV_32FC1 写成图像文件格式吗?
  2. 为什么上面imwrite写的文件全黑了?
  3. 我还在输出中寻找最小值和最大值,因此我可以将它标准化为 CV_8UC1 的 256 个 bin,但它不起作用,即使我使用 imshow imwrite.
  4. 如何将其转换为 CV_8UC1 或将其写入图像文件格式?我使用了 convertTo,但效果不佳。

非常感谢。

最佳答案

imwrite/imread只能处理8/16/24/32bit整型数据,不能处理 float (如果不算ilm/exr的话)

你可能想要:

Mat gray_in = ...
Mat gray_out;
cv::normalize( tan_triggs_preprocessing(gray_in), gray_out, 0, 255, NORM_MINMAX, CV_8UC1); 

(诚然很难发现,但它甚至出现在 bytefish 代码的小字中;)

另外,请查看替代方案,例如 equalizehistCLAHE

关于c++ - 我怎样才能在 OpenCV 中写 float 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23663180/

相关文章:

c# - 在 C++ 中,我可以有一个函数/方法通过引用传递一个参数,而一个重载通过值传递它吗?

c++ - 定义 "library-safe"代码的概念

python - 类型错误 : Required argument 'ranges' (pos 2) not found

c++ - OpenCV Mat::operator= - 它支持写时复制吗?

c++ - 是否可以在图形卡上渲染场景,然后将图像传输回系统内存

c++ - 我想学习win32编程

c++ - 合并两个文本文件的库

c - 哪个代码更好?我们如何理解这一点?为什么第二个代码中的最终打印功能有时会打印随机数?

c - C 中用于网络编程的 accept() 函数

c++ - 使用 Cg :compile error:semantic "POSITION" not visible in this profile 进行体绘制