2016-04-21 11 views
1

Was ich versuche ist eine Funktion zu schreiben, die ein Histogramm eines Graustufenbildes mit einer weitergeleiteten Anzahl von Bins (anzBin) berechnet, in die der Histogrammbereich unterteilt ist. dann durch die Bildpixel ich bin mit ihrem Wert auf die verschiedenen Behälter und bei compairing ein Wert paßt, um den Wert des bin Erhöhung von 1Ich versuche mein eigenes Histogramm zu berechnen ohne opencv calcHist()

vector<int> calcuHisto(const IplImage *src_pic, int anzBin) 
    { 
    CvSize size = cvGetSize(src_pic); 
    int binSize = (size.width/256)*anzBin; 
    vector<int> histogram(anzBin,0); 

    for (int y = 0; y<size.height; y++) 
    { 
     const uchar *src_pic_point = 
     (uchar *)(src_pic->imageData + y*src_pic->widthStep); 
     for (int x = 0; x<size.width; x++) 
     { 
     for (int z = 0; z < anzBin; z++) 
     { 
      if (src_pic_point[x] <= z*binSize) 
      { 
       histogram[src_pic_point[x]]++; 
      } 

     } 

    } 
} 
return histogram; 
} 

Aber leider ist es nicht funktioniert ... Was falsch ist Hier? Bitte helfen

+0

'int binSize = (size.width/256) * anzBin;' Ist 'binSize' 0 hier wegen Ganzzahlmathematik? Ich meine, wenn size.width kleiner als 256 wäre, wäre 'binSize' nicht 0? – drescherjm

+0

Es ist nicht das, was ich versuche zu berechnen, du hast Recht. Mein Ziel ist etwas wie: binSize = (Image()/256) * anzBin aber wie kann ich das tun? – AloisD

+0

Ersetzen 256 mit 256.0 – drescherjm

Antwort

3

Es gibt ein paar Probleme kann ich

  1. Ihre binSize Berechnung ist falsch
  2. Ihr Binning-Algorithmus zu sehen ist einseitig, und sollte zweiseitig
  3. Sie Inkrementieren nicht die richtige bin, wenn Sie eine Übereinstimmung finden

1. binsize Berechnung

bin size = your range/number of bins

2. zweiseitig Binning

if (src_pic_point[x] <= z*binSize) 

Sie benötigen einen zweiseitigen Wertebereich, keine einseitige Ungleichheit. Stellen Sie sich vor Sie haben 4-Bins und Werte von 0 bis 255. Ihre Behälter sollten die folgenden Bereiche

bin  low  high 
0  0  63.75 
1  63.75 127.5 
2  127.5 191.25 
3  191.25 255 

Zum Beispiel haben: ein Wert von 57 in bin gehen sollte 0 Ihr Code sagt der Wert geht in allen Fächern! Weil es immer <= z*binsize Du brauchst etwas mit einer unteren und oberen Grenze.

3. Inkrementieren des entsprechenden bin

Sie verwenden z über jeden Behälter in einer Schleife, so dass, wenn Sie eine Übereinstimmung finden Sie bin erhöhen sollte z, Sie verwenden Sie nicht den tatsächlichen Pixelwert außer bei der Bestimmung zu welchem ​​Fach gehört es

das wäre wahrscheinlich Pufferüberlauf Stellen Sie sich vor, Sie haben 4 Bins, und das aktuelle Pixel hat einen Wert von 57. Dieser Code sagt Inkrement Bins 57. Aber Sie haben nur 4 Bins (0-3)

histogram[src_pic_point[x]]++; 

Sie wollen nur das ist der Pixelwert in


dass
histogram[z]++; 

CODE fällt erhöhen Mit im Auge ist hier überarbeiteter Code (es nicht getestet, sollte aber funktionieren)

vector<int> calcuHisto(const IplImage *src_pic, int anzBin) 
{ 
    CvSize size = cvGetSize(src_pic); 
    double binSize = 256.0/anzBin;  //new definition 
    vector<int> histogram(anzBin,0);  //i don't know if this works so I 
              //so I will leave it 

    //goes through all rows 
    for (int y = 0; y<size.height; y++) 
    { 
     //grabs an entire row of the imageData 
     const uchar *src_pic_point = (uchar *)(src_pic->imageData + y*src_pic->widthStep); 

     //goes through each column 
     for (int x = 0; x<size.width; x++) 
     { 
      //for each bin 
      for (int z = 0; z < anzBin; z++) 
      { 
       //check both upper and lower limits 
       if (src_pic_point[x] >= z*binSize && src_pic_point[x] < (z+1)*binSize) 
       { 
        //increment the index that contains the point 
        histogram[z]++; 
       } 
      } 
     } 
    } 
    return histogram; 
} 
+1

Ok habe ich gerade überprüft es und es funktioniert !!! Ich danke dir sehr!!! Genau das habe ich gesucht. Einen schönen Tag noch! – AloisD