如何在OpenCV中编写浮动图像
How can I write float image in 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…]之间。以下是我的问题,希望你能帮助我,非常感谢
- 我可以将CV_32FC1写入图像文件格式吗
- 为什么上面
imwrite
写的文件全黑 - 我还在输出中查找最小值和最大值,因此我可以将其规范化为CV_8UC1的256个bin,但它不起作用,即使我使用
imshow
或imwrite
也是如此 - 如何将其转换为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
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- 如何在 OpenCV 中将图像与另一个图像相关联
- 如何在 OpenCV c++ 中压缩 TIFF 格式的图像?
- OpenCV - 如何在灰度图像上应用 Kmeans?
- 阅读和处理图像(OpenCV/C )
- cv::findContours 正在修改源图像 OpenCV 2.3
- 将图像替换为更大尺寸的图像 (OpenCV)
- 显示像素值已更改的图像openCV
- 具有积分图像的快速模糊图像(OpenCV)
- 扫描图像OpenCV上的文档检测
- 使用cv::Mat图像(opencv)如何检测对象
- 写作和展示图像OpenCV
- 从文件夹中读取图像(OpenCV)
- 无法保存从网络摄像头捕获的图像(OpenCV 2.3 的 imwrite 编译错误)
- 旋转不变的多个模板出现在图像Opencv