VIDTAKER.COM

Q&A

アルゴリズムの課題:画像から生成カラースキーム


背景

だから、私はWebアプリケーションの新鮮な反復に取り組んでいる。そして、我々のユーザーがと夢中になって見つけた怠け者。本当に怠け者。実際には、より多くの仕事は、我々は彼らのために行うには、詳細は、サービスが大好きです。既存のアプリケーションの部分は、ユーザーの色スキームを使用するように選択する必要があります。しかし、我々は)画像(ユーザのウェブサイトのスクリーンショットがあるので、なぜ私たちはちょうど彼らの怠惰を嫌というほどことはできませんし、それらのためにですか? 、それは楽しいプログラミング演習される回答:私たちはすることができます! :)

挑戦

イメージを考えると、どのように方式を行うには色を作成対応する?言い換えれば 、他の方法)しないアプリケーション定義して、Webは、選択した一次Xの場所(画像の色をにXが。画像は当社の特定の状況で使用したユーザーのウェブサイトのスクリーンショットは、フル解像度(例:1280 × 1024)で撮影されます。 (注:単純にあなたのアルゴリズムを記述してください - 必要はない、実際の擬似コードを書いている。)

ボーナスポイント(通りクレドポイントではなく、実際のSOポイント)さ:

  • シンプルで効果的アルゴリズムを記述する。コードはどのように作成 - 保管して、それシンプルで美しい。
  • スキームを合わせて色のユーザーを微調整する許可の様々な気分''などカラフルな'、'明るい'、'ミュート'、'ディープ'、等(アラカルトkulerの)
  • )、アルゴリズム別の記述は、メソッドのために確実に独自の色を決定する主なテキストの使用が必要になります可能性が高いのスクリーンショットWebサイト(。

吸気

も同様の機能を実行するいくつかの既存のサイトがあります。お気軽にそれらをチェックアウトして無料で自分自身に問う、"どうやってこれを重複して希望ですか?どのように私はそれを改善するか?"

楽しんでおいで! :)



6 Replies

1)

  1. 、一次Xの色を見つけるアプリをスクリーンキャプチャしてください。実行イメージの色ヒストグラム。ヒストグラムの一番上からXの色がテーマです。編集:オレンジ色の1つのメインの色のグラデーションで使用される場合、グラデーションが使用されている場合は、色の異なる"ピーク"を選択したいと思う、つまり場合は、色の全体の束を回避する正しい"オレンジ"があります。実際には、ちょうどあなたの色のヒストグラムから選ばれた距離の一定額を適用します。

  2. 彼らはそれ以上の"カラフル"、彩度を向上させるようにする場合のカラースキームを調整は、最高のHSV空間で行うことができます。HSV空間に色を変換し、場合、ユーザーはそれになりたい"明るい"とは、、の値を増やす等

  3. テキストの色を決定が最高の高変動(フーリエ変換の高周波領域)の領域を特徴づけることにより行うことができます。これらの地域内では、のいずれかが必要:2色、テキスト、背景、その場合、テキストは使用頻度の低い色、または、どの場合にはテキストの色は、いくつかの色を、テキストと背景のイメージの色、必要があるでしょう最も一般的な色です。


2)

必要に応じアルゴリズム型の名前ですカラー量子化

残念ながら私はあなたのために利用しないているソースコードは、しかし、私は必ずGoogleの検索が何かをできる電源を入れます。

特に、博士Dobb 's Journal』の記事では、テーマに有望だ。


3)

平均色相、彩度、明るさを個別値/最大値分を維持しながら。

ロック平均すべての色の目標色相と境界の間のX点の彩度、明るさを補間。これは色のスキームを返す必要がありますフォトような単純な変化が同じにキャストします。おそらくあなたもAppleの視線を取得します。

ちょうどあなたは犬の嫌なやつの3色を取得することを望みます。


4)

McWafflestixのソリューションと同様に、具体的な必要がしますが、調整することに私の一般的なアプローチのようになります...

(私は、HSVは右のスペースです)に同意

  1. グラブは、画像のヒストグラムは、ノイズを滑らかにする、フィルタリングとVとS可能性が高い"件名"色の(おそらくダイナミック)域にある最も高いスコアを見つける。青空に赤い鳥が、我々は十分なブルーの私達のスキームを基にスマートではないこと、が必要になりますが、赤に。これは3分の1の"ルールとフレーム"が、必要な写真についての推測を組成のような"を中心に"分析は、関連されてできる色を与える場合に確率をいずれにせよ、これは色が当社の基本。

  2. カラーホイールを動かすことにより、基本を補完する色を計算kulerの行、に沿って。計算褒めのためのエキストラポイントも目立つようにステップ1からヒストグラムに掲載されてください。

  3. それぞれのライターと暗いバージョンでは、多かれ少なかれ、飽和などの補助色を喜ば派生する基本色と計算されるお世辞を使用して


5)

  1. のr -多くの長方形のグリッドには、nのmで画面イメージを分割"グリッド"は、各ショット/ n幅(幅の合計)と高さ(全高/ m)です。

    1aの。割り当て画面の高プロファイルの分野に重み左オフ中心エリアなど。

    1bに。四角形はそれぞれ、(スペースのピクセルを割り当てるに色、 周波数

  2. 各四角形はR、周波数分布f_r化、体重W_R:

    2aは。決定は、i番目方式の色(ブロックなどはi = 1 < - >背景色ごとに私は、:]))によるスキャン"トップ周波数を"、"第2の周波数"([すなわちf_r化

    2bは。 はそれぞれ、W_Rを*入れ、それをのスコアテーブル(color_i、スコアここで、スコア= f_r化[私は、"周波数"]

    2cの。各私は得点がトップ配色されるi 番目

理論的には、白い"または"黒"の赤い場合は、取得する必要が青い"の数が多い場合は白主、青二、黒主、赤二、たとえば。

あなたのテキストの色は、オフに背景色、またはセカンダリ色を選択の計算のいずれかの基本これを直接、およびHSVのVの違い場合も、基本オフ計算方式の色の色低ですが、Vの値を増大させる。

擬似:

float[][] weights = 
    { { 1.0, 3.0, 5.0, 5.0, 3.0, 1.0, 1.0, 1.0, 1.0 },
      { 2.0, 6.0, 7.0, 7.0, 6.0, 2.0, 3.0, 3.0, 2.0 },
      { 2.0, 8.0, 9.0, 9.0, 7.0, 3.0, 6.0, 6.0, 3.0 },
      { 2.0, 8.0, 9.0, 9.0, 7.0, 2.0, 3.0, 3.0, 2.0 },
      { 2.0, 7.0, 9.0, 9.0, 7.0, 2.0, 1.0, 1.0, 1.0 },
      { 2.0, 6.0, 7.0, 7.0, 6.0, 2.0, 3.0, 3.0, 1.0 },
      { 1.0, 3.0, 5.0, 5.0, 3.0, 2.0, 6.0, 6.0, 2.0 },
      { 1.0, 1.0, 2.0, 2.0, 1.0, 2.0, 6.0, 6.0, 2.0 },
      { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 3.0, 1.0 } };

// Leave the following implementations to the imagination:
void DivideImageIntoRegions( Image originalImage, out Image[][] regions );
void GetNthMostCommonColorInRegion( Image region, int n, out Color color );
TKey FindMaximum<TKey, TValue>( Map<TKey, TValue> map );

// The method:
Color[] GetPrimaryScheme( Image image, int ncolors, int M = 9, int N = 9 )
{
    Color[] scheme = new Color[ncolors];
    Image[][] regions = new Image[M][N];

    DivideImageIntoRegions( image, regions );

    for( int i = 0; i < ncolors; i++ )
    {
        Map<Color, float> colorScores = new Map<Color, float>();

        for( int m = 0; m < M; m++ )
        for( int n = 0; n < N; n++ )
        {
            Color theColor;
            GetNthMostCommonColorInRegion( region, i, theColor );

            if( colorScores[theColor] == null )
            { colorScores[theColor] = 0; }

            colorScores[theColor] += weights[m][n];
        }

        scheme[i] = FindMaximum( colorScores );
    }

    return scheme;
}

上記のを見ると、それは明らかにほとんど変動を持つ地域ですが、それは最も一般的な色と同じ2番目に一般的な色を持っている。 、このような場合には1つのを防ぐことがnullの場合、可能性があります2番目に最も一般的な色を調整するには:

            if( theColor != null )
                continue;

            if( colorScores[theColor] == null )
            { colorScores[theColor] = 0; }

            colorScores[theColor] += weights[m][n];
        }

6)

すでに良い提案の多くは、どのように原色を見つけることが、私は同様のアプローチを試みる。テキストの色を見つけるために、私は別の提案している。

計算上から下へ画像の各ラインのヒストグラム。するたびに、行のベースラインに到達するが、テキストの色の周波数に強いドロップする必要があります。次の行2番目の手順は、小文字に到達しfollowdの大文字に到達するまでの周波数が低いままになります。

ある場合でも、ベースラインを打つ大きくなる別の強いピークれている場合は、背景色を発見した。グラデーションの背景には、このピークとピークの変化を滑らかにする - ときに入力するか、新しい行を残して - アンチエイリアシングによって平滑化されます。