2012-12-19 18 views
6

Also habe ich versucht herauszufinden, wie man den durchschnittlichen Farbton einer Anzahl von Objekten berechnet, deren Farben durch HSL-Werte repräsentiert werden. Glücklicherweise bin ich über this Stack Overflow post gestolpert und habe mich daran gemacht, den in der oberen Antwort angegebenen Algorithmus zu implementieren (ich arbeite in C++).Mittelwertbildung von Kreiswerten (besonders Hues im HSL-Farbschema)

Leider scheint meine Implementierung nicht zu funktionieren. Hier ist es vollständig; Beachten Sie, dass obwohl ich "Farbton" schreibe, verwende ich Winkel, in Grad, wie bei der anfänglichen Implementierung (Wechsel von 0-360 Winkel zu 0-256 Farbtönen, sobald ich weiß, dass mein Code funktioniert, sollte nicht schwer sein).

#include <iostream>  
#include <vector> 
#include <cmath> 

#define PI (4*atan(1)) 

int main() 
{ 
    /// 
    /// Calculations adapted from this source: 
    /// https://stackoverflow.com/questions/8169654/how-to-calculate-mean-and-standard-deviation-for-hue-values-from-0-to-360 

    std::vector<double> Hues = {355, 5, 5, 5, 5}; 

    //These will be used to store the sum of the angles 
    double X = 0.0; 
    double Y = 0.0; 

    //Loop through all H values 
    for (int hue = 0; hue < Hues.size(); ++hue) 
    { 
     //Add the X and Y values to the sum X and Y 
     X += cos(Hues[hue]/180 * PI); 
     Y += sin(Hues[hue]/180 * PI); 
    } 

    //Now average the X and Y values 
    X /= Hues.size(); 
    Y /= Hues.size(); 

    //Get atan2 of those 
    double AverageColor = atan2(X, Y) * 180/PI; 

    std::cout << "Average: " << AverageColor << "\n"; 
    return 0; 
} 

Statt die erwartete Antwort von 3 (da in diesem Schema auf -5 entsprechen 355 sollte), erhalte ich 86,9951.

Kann jemand darauf hinweisen, was ich falsch mache? Das scheint sehr einfach zu sein.

Antwort

7

atan2 nimmt seine Argumente in umgekehrter Reihenfolge. Ich weiß, nervig! So versuchen Sie:

double AverageColor = atan2(Y, X) * 180/PI; 

Die Antwort, die es jetzt gibt, ist 3.00488.

+0

Oh Götter, das ist peinlich. Ich hätte das sehen sollen. Vielen Dank! – GarrickW

+4

Eine Möglichkeit, sich an diese Tatsache zu erinnern, besteht darin, sich daran zu erinnern, dass das, was Sie zu tun versuchen, 'atan (Y/X)' ist, außer dass es immer noch als 'X -> 0 'funktionieren soll. Diese Art von Aussehen sieht wie folgt aus: atan2 (Y, X). –

+0

Um das Leben des Programmierers zu vereinfachen, beachten Sie, dass einige Sprachen in umgekehrter Reihenfolge sind - zum Beispiel in Excel atan2 (x; y) –

2

Versuchen Sie atan2(Y, X). atan2(a,b) ist ähnlich wie atan(a/b), und Sie brauchen den Arcustangens des durchschnittlichen Sinus über den durchschnittlichen Kosinus.