有人给了我这个功能:
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 ...]之间。这是我的问题,希望您能为我提供帮助,非常感谢。
imwrite
编写的文件全黑? imshow
或imwrite
也不起作用。 convertTo
,但效果不佳。 非常感谢。
最佳答案
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);
(虽然很难发现,但即使在字节鱼代码的小字体中也是如此;)
另外,请查看替代方法,例如equalizehist和CLAHE