6

そこで、色がHSL値で表される多数のオブジェクトの平均色相を計算する方法をパズルで解こうとしていました。ありがたいことに、私はこのStack Overflowの投稿に出くわし、一番上の回答で提供されているアルゴリズムの実装に取り​​掛かりました(私はC ++で作業しています)。

残念ながら、私の実装は機能していないようです。これが完全です。「色相」と書いていますが、最初の実装に従って角度を度単位で使用していることに注意してください(コードが機能することがわかったら、0〜360度の色相から0〜256度の色相に切り替えるのは難しいことではありません)。

#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;
}

予想される3の答えの代わりに(このスキームでは355は-5に相当するはずなので)、86.9951を取得します。

誰かが私が間違っていることを指摘できますか?これは非常に基本的なようです。

4

2 に答える 2

7

atan2引数を逆の順序で受け取ります。私は知っている、迷惑です!だから試してみてください:

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

それが今与える答えは3.00488です。

于 2012-12-19T19:10:09.017 に答える
2

試してみてくださいatan2(Y, X)atan2(a,b)は に似てatan(a/b)おり、平均余弦に対する平均正弦のアークタンジェントが必要です。

于 2012-12-19T19:11:57.027 に答える