MATLAB和C ++中OpenCV的不同像素值

我看到有类似的问题,但不要回答我所问的问题,所以这里是我的问题。

在OpenCV的C ++中,我运行我将在下面提供的代码,它返回的平均像素值为6.32。 但是,当我打开图像并在MATLAB中使用平均函数时,它会返回约6.92ish的平均像素强度。 正如你所看到的,我将OpenCV值转换为double来试图缓解这个问题,并且发现openCV将图像加载为一组整数,而MATLAB将图像加载为十进制值,这些十进制值与整数显然大致相同但不完全相同。 所以我的问题是,对编码是新的,这是正确的? 我假设MATLAB正在返回更准确的值,如果是这种情况,我想知道是否有方法以相同的方式加载图像以避免差异。

谢谢,下面的代码

    Mat img = imread("Cells2.tif");
cv::cvtColor(img, img, CV_BGR2GRAY);
cv::imshow("stuff",img);
Mat dst;
if(img.channels() == 3)
{
    img.convertTo(dst, CV_64FC1);
}
else if (img.channels() == 1) 
{
    img.convertTo(dst, CV_64FC1);
}
cv::imshow("output",dst/255);
int NumPixels = img.total();


double avg;
double c = 0; 
double std;
    for(int y = 0; y < dst.cols; y++)
    { 

        for(int x = 0; x < dst.rows; x++)
        {
            c+=dst.at<double>(x,y)*255;
        }
    }

avg = c/NumPixels;
cout << "asfa = " << c << endl;
double deviation;

double var;
double z = 0;
double q;
    //for(int a = 0; a<= img.cols; a++)
for(int y = 0; y< dst.cols; y++)
    {
        //for(int b = 0; b<= dst.rows; b++)
        for(int x = 0; x< dst.rows; x++)
        {
            q=dst.at<double>(x,y);

            deviation = q - avg;
            z = z + pow(deviation,2);
            //cout << "q = " << q << endl;
        }

    }

var = z/(NumPixels);
std = sqrt(var);
cv::Scalar avgPixel = cv::mean(dst);

cout << "Avg Value = " << avg << endl;
cout << "StdDev = " << std << endl;
cout << "AvgPixel =" << avgPixel;

cvWaitKey(0);
return 0;

}


根据您的评论,图像似乎以16位深度存储。 MATLAB按原样加载TIFF图像,而默认情况下OpenCV会将图像加载为8位。 这可能会解释您所看到的精度差异。

使用以下命令在OpenCV中打开图像:

cv::Mat img = cv::imread("file.tif", cv::IMREAD_ANYDEPTH|cv::IMREAD_ANYCOLOR);

在MATLAB中,它很简单:

img = imread('file.tif');

接下来你需要知道你正在使用的数据类型。 在OpenCV中它的CV_16U,在MATLAB中它的uint16 。 因此您需要相应地转换类型。

例如,在MATLAB中:

img2 = double(img) ./ double(intmax('uint16'));

会将其转换为double图像,范围为[0,1]


加载图像时,必须在两种环境(MATLAB和OpenCV)中使用类似的方法,以避免可能在任一环境中默认进行的转换。


  • 如果符合某些条件,您正在转换图像,这可以改变一些颜色值,而MATLAB可以选择不转换图像,但使用原始图像
  • 颜色大多以十六进制格式表示,其格式为0xAARRGGBB或0xRRGGBBAA,因此32位整数将会执行(无符号/有符号无关紧要,十六进制值仍然相同),创建64位变量,全部添加32位变量,然后除以像素数量,这将得到一个相当准确的结果(对于16384×16384像素的图像(其中32位值代表一个像素的颜色)),如果大于,则一个64位整数将不够)。

    long long total = 0;
    long long divisor = image.width * image.height;
    for(int x = 0; x < image.width; ++x)
    {
        for(int y = 0; x < image.height; ++x)
        {
            total += image.at(x,y).color;
        }
    }
    double avg = total / divisor;
    std::cout << "Average color value: " << avg << std::endl;
    
  • 链接地址: http://www.djcxy.com/p/89785.html

    上一篇: Different Pixel Values in MATLAB and C++ with OpenCV

    下一篇: point pixel coordinates in opencv