OpenCV无法获得Mat的正确最大值和最小值

时间:2014-01-19 09:07:47

标签: c++ matlab opencv

我试图找到Mat的最大值和最小值,但我无法得到正确的答案。我在MATLAB中获得了maxValue == 2.2222和minValue == 0.0810810的正确最大值和最小值。但我得到了其他结果是OpenCV中的maxValue == 8.988e + 307和minValue == 0.0232549。在OpenCV中,我使用了两个方法,std :: max_element()和minMaxLoc(),得到了相同的结果。 我的代码(OpenCV):

#include <iostream>
#include <string>
#include <math.h>

#include <cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#define PI 3.1415926

using namespace std;
using namespace cv;

int main()
{
    Mat img=imread("test.jpg");
    if(!img.data)
    {
        cout<<"Error:Reading image!"<<endl;
    }

    img.convertTo(img,CV_64FC3);

    vector<Mat> rgb;
    split( img, rgb);
    Mat B=rgb[0];
    Mat G=rgb[1];
    Mat R=rgb[2];

    Mat x,X,y,Y;
    divide(R,G,x,1);
    divide(B,G,y,1);
    log(x,X);
    log(y,Y);

    Mat projectedPoint;
    projectedPoint=X.mul(cos(PI))+Y.mul(sin(PI));

    Mat imgGrey;
    exp(projectedPoint,imgGrey);

    //method 1;
    cout<<"max_element=="<<*max_element(imgGrey.begin<double>(),imgGrey.end<double>())<<endl;

    //method 2;
    double imgGreyMin=0;
    double imgGreyMax=0;
    minMaxLoc(imgGrey,&imgGreyMin,&imgGreyMax,NULL,NULL);
    cout<<"minValue=="<<imgGreyMin<<" maxValue=="<<imgGreyMax<<endl;

    waitKey(0);
    return 0;
}

MATLAB:

clc;
clear;
format long;
img=imread('test.jpg');
img=im2double(img);
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);
X=log(R./G);
Y=log(B./G);

W=size(X,1);
L=size(X,2);

projectedPoint=ones(W,L);
projectedPoint=X*cosd(180)+Y*sind(180);
imgGrey=exp(projectedPoint);

minValue=min(min(imgGrey));
maxValue=max(max(imgGrey));

1 个答案:

答案 0 :(得分:1)

我的猜测是问题不在minMaxLoc中,即当你的函数达到这一点时,imgGrey确实有如此大的值。如果G像素之一等于零,可能会发生这种情况(我猜MATLAB对这种情况的处理方式不同)。

另一方面,我不太明白这条线的用途:

projectedPoint=X.mul(cos(PI))+Y.mul(sin(PI));

cos(PI)为-1。 sin(PI)为0.您可以写:

projectedPoint = -X;