2015-01-20 3 views
0

Я хочу нормализовать карту разметки таким образом, чтобы: 1. Норнализировать значения на карте до фиксированного диапазона [0..M] 2. Найти M (глобальные максимумы в изображении с разной степенью) и m (среднее значение все другие локальные максимумы) 3.globally multyplying карту на квадрат (мм)Как нормализовать differnce карту в C++ с помощью opencv?

Но я не получаю правильный выход ... Масштабный коэффициент слишком высок .. примерно 23000 .. не должна быть между 0-255?

int main() 
{ 

    Mat img = imread("lena.jpg",CV_LOAD_IMAGE_GRAYSCALE); 
    Mat img1,diff; 

    if (img.empty()) //if unsuccessful, exit the program 
    { 
      cout << "Image cannot be loaded..!!" << endl; 
      return -1; 
    } 

    int m,n; 
    m=(int)(img.rows/2); 
    n=(int)(img.cols/2); 
    resize(img, img1,Size(m,n));  //downsample by 2 

    resize(img1, img1,img.size(), 0, 0, CV_INTER_NN); //interpolation by 2 

    absdiff(img,img1,diff); 


    //------to find global maxima present in the image------------- 
    double min2,max2; 
    Point x,y; 
    minMaxLoc(diff,&min2,&max2,&x,&y); 
    cout<<"global max= "<<max2<<" location= "<<y<<endl; 

    //--to find local maximas present in the image using 5*5 kernel---- 
    double min1,max1; 
    double val[2025]; 
    int count=0; 
    Mat arr=Mat::zeros(5,5,img.type()); 
    int i,j,a,b,a1; 
    for(a=0;a<diff.rows;a=a+5) 
    { 
     for(b=0;b<diff.cols;b=b+5) 
     { 
      m=n=0; 
      for(i=a;i<a+5;i++) 
      { 
       for(j=b;j<b+5;j++) 
       {     
        a1=diff.at<uchar>(i,j); 
        arr.at<uchar>(m,n)=a1;     
        n++;   
       } 
       m++;n=0; 
      } 
      minMaxLoc(arr,&min1,&max1); 
      val[count]=max1; 
      count++; 
     } 
    } 

    double sum=0,mean; 
    for(i=0;i<count;i++) 
    { 
     sum=sum+val[i]; 
    } 

    mean=sum/count; 
    cout<<"count="<<count<<endl; 
    cout<<"sum= "<<sum<<endl; 
    cout<<"mean= "<<mean<<endl;  

    double scale; 
    scale=pow((max2-mean),2); 
    cout<<"scale= "<<scale; 

    imshow("original",diff); 
    imshow("normalized output",scale*diff); 
    waitKey(0); 
    return 0; 
} 
+0

Ваш код отсутствует '1. Норнализировать значения на карте до фиксированного диапазона [0..M] '. Остальное должно быть в порядке. Если вы не выбрали 'M' или не выбрали' M = 255', ваш квадратный масштабный коэффициент может быть любым размером от 0 до 65025 для 8-битного типа. Так что это все о выборе 'M', который даже не был бы важен, если бы у вас не было ограничений по типу данных. – Micka

ответ

0

Ваша переменная шкала в квадрате в коде:

scale=pow((max2-mean),2); означает (max2-mean)^2, который (M-m)^2

вы просили scale = (M-m) вместо этого, который был бы scale = max2-mean; в коде, если я вижу, что правильно.

+0

В бумаге, на которую я ссылаюсь, ее площадь (М-м) .... – gbu

+0

ссылку на бумагу, пожалуйста. Но тогда я не понимаю, почему вы ожидаете, что '(Mm)^2' находится между« 0..255 » – Micka

+0

, вероятно, вам нужно преобразовать свое изображение в float/double и выбрать подходящий' M' first (возможно, '' M = 1'?) – Micka