我正在尝试使用openCV将图像标准化与下面的代码进行对比。我在Matlab中测试了相同的代码,它在那里工作。但是,它并不适用于OpenCV。我扔了一堆支票,看看我是否在某个地方犯了错误,我有几个问题。
背景:我的图片是尺寸为CV_8U
的unsigned-char w640 x h480
图片。
我使用以下行将图像转换为float CV_32F
:
img.convertTo(img, CV_32F, 1.0f/255.0f);
问题:
我检查了img.at<float>(25,25)
处的像素值,我看到一个大于3000.0f的值。不应该convertTo
函数中的第三个参数缩放我图像中[0.0 1.0]
之间的所有像素强度吗?
我所遵循的想法与之前在Matlab中所做的相似。那里的图像是uint
类型([0 255]),当转换为双倍缩放[0 1]
之间的值时,允许我应用以下代码(在Matlab中):
cGN = (cG - min(cG(:))) ./ (max(cG(:)) - min(cG(:)));
在这里,我忽略了wiki_Contrast_Norm_page中第一个公式中的分子,因为我认为我已经在[0 1]
之间缩放了像素值。我试图在OpenCV中实现相同的公式时要小心,但我可能在某处错了?
代码:
if( img.type() != CV_8U ) {
cout<<" before normalizing image, converting its type to CV_32F \n"<< endl;
img.convertTo(img, CV_32F, 1.0f/255.0f);
}
cout<<"inital access: " << img.at<float>(25,25)<<endl;
//float min_val_class = 0.0f;
//float max_val_class = 1.0f;
float min_val_im = 0.0f;
float max_val_im = 0.0f;
Mat mask = img > 0;
for (int c = 0; c < img.cols; c++) {
for(int r = 0; r < img.rows; r++) {
if( mask.data[r*img.cols + c] != 0 ) {
float value = img.data[r*img.cols + c];
if(value > max_val_im) {
max_val_im = value;
}
if(value < min_val_im) {
min_val_im = value;
}
}
}
}
float imDiff = max_val_im - min_val_im;
float diver = (1/imDiff);
cout <<"min_val_im: " << min_val_im << endl;
res = img.clone();
// now normalize the image
cout<<"before sub: " << res.at<float>(25,25)<<endl;
subtract(res, min_val_im, res);
cout<<"after sub: " << res.at<float>(25,25)<<endl;
res = res.mul((diver));
cout<<"after mul: " << res.at<float>(25,25)<<endl;