【问题标题】:How can I write float image in OpenCV如何在 OpenCV 中编写浮动图像
【发布时间】:2014-05-14 19:12:10
【问题描述】:


有人给了我这个功能:

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,但它不起作用,即使我使用 imshowimwrite
  4. 如何将其转换为 CV_8UC1 或将其写入为图像文件格式?我使用了convertTo,但效果不佳。

非常感谢。

【问题讨论】:

  • 您可以将图像保存为 HDR 图像,.hdr 文件是浮点数。为此,您需要使用目前处于测试阶段的 OpenCV 3.0。
  • 嗨魔术师。非常感谢您的关注。我会考虑的。

标签: c++ c opencv


【解决方案1】:

imwrite/imread 只能处理 8/16/24/32bit 整数数据,不能处理浮点数(如果不计算 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

【讨论】:

  • 嗨贝拉克。非常感谢,但gray_out 还是太黑了。没有tan_triggs_preprocessing(gray_in)那么明亮锐利
  • 你有什么应对办法吗?谢谢。
  • 一对夫妇,但它需要工作,而且已经很晚了。除了 NORM_MINMAX 或直接 tantriggs_output.convertTo(gray_out, CV_8U,255);
  • 哦,别忘了玩 alpha、gamma、tau 等
  • 非常感谢。我会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
相关资源
最近更新 更多