Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV中两个Vec3b图像的MSE_Opencv - Fatal编程技术网

OpenCV中两个Vec3b图像的MSE

OpenCV中两个Vec3b图像的MSE,opencv,Opencv,我有两张Vec3b图像,我想找出它们之间的均方误差。我知道当你有两个uchar图像时该怎么做,但是当你有两个Vec3b图像,其中每个像素存储了3个不同的值时,你怎么计算它?你应该计算每对像素的欧几里德距离: MSE = 0; for(int i = 0; i < width; i++) for(int j = 0; j < height; j++) MSE += sqrt(pow(img1.at<Vec3b>(j, i)[0] - img2.at&

我有两张Vec3b图像,我想找出它们之间的均方误差。我知道当你有两个uchar图像时该怎么做,但是当你有两个Vec3b图像,其中每个像素存储了3个不同的值时,你怎么计算它?

你应该计算每对像素的欧几里德距离:

MSE = 0;
for(int i = 0; i < width; i++)
    for(int j = 0; j < height; j++)
        MSE += sqrt(pow(img1.at<Vec3b>(j, i)[0] - img2.at<Vec3b>(j, i)[0]), 2) + pow(img1.at<Vec3b>(j, i)[1] - img2.at<Vec3b>(j, i)[1]), 2) + pow(img1.at<Vec3b>(j, i)[2] - img2.at<Vec3b>(j, i)[2]), 2));
MSE /= width * height;
MSE=0;
对于(int i=0;i

此代码可以优化,如果您将图像从BGR转换为HSV,您可以根据需要获得更好的结果。

要在opencv中计算1D和3D图像的均方误差,您可以使用此方法,因为图像扫描需要更长的时间,因此速度可能更快

double getMSE(Mat& I1, Mat& I2)
{
    Mat s1;
    // save the I! and I2 type before converting to float
    int im1type = I1.type();
    int im2type = I2.type();
    // convert to float to avoid producing zero for negative numbers
    I1.convertTo(I1, CV_32F);
    I2.convertTo(I2, CV_32F);
    absdiff(I1, I2, s1);       // |I1 - I2|
    s1.convertTo(s1, CV_32F);  // cannot make a square on 8 bits
    s1 = s1.mul(s1);           // |I1 - I2|^2

    Scalar s = sum(s1);         // sum elements per channel

    double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels

    if( sse <= 1e-10) // for small values return zero
        return 0;
    else
    {
        double  mse =sse /(double)(I1.channels() * I1.total());
        return mse;
        // Instead of returning MSE, the tutorial code returned PSNR (below).
        //double psnr = 10.0*log10((255*255)/mse);
        //return psnr;
    }
     // return I1 and I2 to their initial types
    I1.convertTo(I1, im1type);
    I2.convertTo(I2, im2type);

}
double getMSE(Mat&I1、Mat&I2)
{
垫s1;
//在转换为float之前保存I!和I2类型
int im1type=I1.type();
int im2type=I2.type();
//转换为浮点,以避免为负数生成零
I1.convertTo(I1,CV_32F);
I2.转换器(I2,CV_32F);
absdiff(I1,I2,s1);/| I1-I2|
s1.convertTo(s1,CV_32F);//不能在8位上生成正方形
s1=s1.mul(s1);//I1-I2^2
标量s=sum(s1);//对每个通道的元素求和
双sse=s.val[0]+s.val[1]+s.val[2];//和通道
如果(sse
Mat I1(12, 12, CV_8UC1), I2(12, 12, CV_8UC1);
double low = 0;
double high = 255;

cv::randu(I1, Scalar(low), Scalar(high));
cv::randu(I2, Scalar(low), Scalar(high));
double mse = getMSE(I1, I2);
cout << mse << endl;
Mat I1(12, 12, CV_8UC3), I2(12, 12, CV_8UC3);
double low = 0;
double high = 255;

cv::randu(I1, Scalar(low), Scalar(high));
cv::randu(I2, Scalar(low), Scalar(high));
double mse = getMSE(I1, I2);
cout << mse << endl;