对比度标准化问题

时间:2014-07-22 16:11:37

标签: c++ opencv

我正在尝试使用openCV将图像标准化与下面的代码进行对比。我在Matlab中测试了相同的代码,它在那里工作。但是,它并不适用于OpenCV。我扔了一堆支票,看看我是否在某个地方犯了错误,我有几个问题。

背景:我的图片是尺寸为CV_8U的unsigned-char w640 x h480图片。 我使用以下行将图像转换为float CV_32F

img.convertTo(img, CV_32F, 1.0f/255.0f);

问题:

  1. 我检查了img.at<float>(25,25)处的像素值,我看到一个大于3000.0f的值。不应该convertTo函数中的第三个参数缩放我图像中[0.0 1.0]之间的所有像素强度吗?

  2. 我所遵循的想法与之前在Matlab中所做的相似。那里的图像是uint类型([0 255]),当转换为双倍缩放[0 1]之间的值时,允许我应用以下代码(在Matlab中):

    < / LI>

    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;
    

0 个答案:

没有答案