如何在OpenCV中编写浮动图像

How can I write float image in OpenCV

本文关键字:图像 OpenCV      更新时间:2023-10-16


有人给了我这个功能:

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,但效果不太好

非常感谢。

imwrite/imread只能处理8/16/24/32位整数数据,不能处理浮点(如果不计算Ilm/exr(

你可能想要:

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

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

此外,请考虑其他选择,如equalizhist和CLAHE