色の概念を思いついたオリジナルのシステムを考えてみてください-男。 色を認識するコンピューターは、人間の知覚システムを模倣する必要があります。
主な質問は次のとおりです。人はどのように色を見ますか?
とりあえず、光のある人の視界で物体の物質がどのように相互作用するかを省略し、すでに目にしている波を考えてみましょう。 光の周波数を直接決定することはできません。3つの基本周波数(RGB)での放射強度の予想指標と比較するだけです。 これらは3つの基本的な色で、それぞれに独自の検出器があります。
次に、主なことが起こります-コーンとスティックの値を色に変換する必要があります。 さらに、人は、絶対的なピッチを持つ人のように絶対的な用語で比較しません-撮影された音の頻度で、相対的な用語で- 影、グレアなどがオブジェクトに落ちるとき 。 その後、彼はトーンのグループを識別し、(これは重要です!)1つのラベルの下のブロックに陰影を付けます-たとえば、「黄色です」。
→さらに、 原則として色の知覚の相対性について、そして色がどのように、正確に、そしてどのような順序でラベル付けされたかについて読むことができます
今、コンピューターについて。
信号がカメラに届くと、マトリックスは同じ3つの原色を認識し、その後...データを圧縮し、レンズの収差やコンピューターで受信したストリームの基本的な補正を実行することもあります。 コンピューターは、さまざまなコーデックを使用して既にストリームを解読し、ビデオを受信できます。 しかし、これは私たちが探しているビデオではありません。
ここでは、解像度と歪みを省略して、色に焦点を当てましょう。 カメラに均一に照明されたソリッドな長方形をカメラに表示すると、フレーム内で画像を構成するピクセルが異なります。 さらに少し進むこともできます。 そのような前処理の段階の1つで、ピクセルのブロックの形式で挿入をロードします。 同じテスト長方形、私たちだけが光のレベルと色の質感を心配することはできません。
以下では、このような実験の結果を見ることができます。 小さな長方形がフレームに収まり、画像を挟む不気味なアルゴリズムが通過し、出力ではほぼ同じ長方形が得られます。 わかりやすくするために、画像の緑のチャネルを削除してコントラストを上げることで、変更を強調しました。
これで、この画像(既にゴミが含まれている)を、それを処理するプログラムに盗む必要があります。 これらの目的でOpenCVライブラリを使用しました。 また、多くの機能も備えています。 それらは、画像がどのように保存および送信されるかに専念しています。 さまざまな読み取りモードがあります。 一番下の行は簡単です。4チャンネルがなくても、一部の3チャンネルの画像は4チャンネルのデバイスとして送信されます。 ライブラリ読み取り関数は、構造{26,54,250} {40,47,245} {30,26,255}を待機しているバイトをカウントします...
ストリームファイルの形式は{26,54,250,111} {40,47,245,110} {30,26,255,112} ...
3バイトを読み取ると、次の結果が得られます{26,54,250、111 } { 40,47、245,110} { 30、26,255,112} ...
このエラーは、画像を表示するときに簡単に認識できます。1つの色のオブジェクトは、赤、緑、青、灰色のピクセルの交互になります-円の中に4つ。 他の方法を混同すると、ほとんどの処理コードはエラーをスローします。これは、割り当てられたメモリ以外のメモリへの呼び出しがあるためです。 すなわち そのような結果で、読み取りモードを変更することは理にかなっています。
最後に、正しいファイルを取得しました。 しかし、その色を強調する方法は不明です。 オブジェクトが実際に同じ色のピクセルで指定されている場合、問題はありません。ピクセルを反復処理し、最も存在するピクセルを選択するだけです。 しかし、2つの問題があります。 最初は照明です。 2つ目は、カメラが置かれているスカーフを使用した画像処理です。 類似のピクセルを同じと見なすための差のしきい値を入力できます。これは、色の解像度を独自に下げた場合と同じです。 しかし、残念ながら、これを行わない理由は2つあります。 まず、同じ色のピクセルはRGB値が大きく異なる場合があります。 そして2番目-各色のRGB空間のボリューム(人々が定義したとおり)は異なります。 そうだとすれば、各色のブロックを選択し、6つの制限座標を指定し、それらを正確に決定するようにネットワークに指示することができます...しかし、繰り返しますが、RGBのブロックは複雑な形状を持ち、これらは平行六面体ではありません。 ステップを減らす場合はパラメーターを追加する必要があります(最大255分の1まではオプションですが、それを減らす必要があります)ネットワーク入力データの数が増加し、残念ながらガベージデータは有用なデータよりも速く成長します。 前処理が必要です。 オブジェクトのピクセルをよく見ると、すばらしいことがわかります。HLSスペースの色相パラメーターの違いは、RGBのどのパラメーターよりも小さくなります。
HLSのように見える
すべてのピクセルをHLSに変換しました(念のため、関数を手動で作成しました-さまざまな翻訳システムがあるため、組み込みのライブラリー関数には触れず、グラフィックエディターに組み込まれた関数をシミュレートしました)。次に、色を分離する基本的な境界値を指定しました。 たとえば、次の図を注意深く見ると、それらを使用できます。
トリッキーなものです。 残りのパラメーターはまだ削除されていません。 白、黒、灰色、茶色は、人の視点では非常に基本的な色ですが、色相とはかなり弱い関係があります-光と彩度なしでは対処できません。 まあ、同じ基本的な障壁を目に追加し、システムがどのように動作するかを確認します。
15の原色を強調表示してラベルを付け、テストを開始しました。 写真に標準のGoogle検索ツールを使用して、色で結果をフィルター処理しました。まず、オブジェクトと背景の写真ではなく、単調な写真(草や黄色の葉など)を撮りました。 データセットで不要な画像を自分で表示およびフィルタリングすることは、トレーニングの重要な部分です。 トレーナーのいないネットワークがあり、値を手動でひねりました。
次に、100個の正しく識別された色を連続して受け取った後、背景のオブジェクトに切り替えました(作業環境からアルゴリズムを適用するオブジェクトを取得しました)。 ここにはトリックがあり、特定の色のピクセルに投票するとき、ピクセルの各クラスターの候補である独自のブランチを作成する必要があるという事実にあります。 列挙はすべてのピクセルで行われるため、同じ色の複数のセルを簡単に作成できます。 たとえば、次の図では、行ごとの検索で赤ピクセルのセットのインコヒーレンスが明らかになり、「赤」形式の2つのレコード(0)が作成されます。1つ目は1つの赤いボールのピクセルでインクリメントされ、2つ目のピクセルは2つ目のピクセルに投票します。
念のため、関数は最大投票数のレコードだけでなく、2位(オブジェクトの背景が1位になっている場合)および色調のないトーンの1位を返します(色空間のグレーと黒のボリュームが飽和のボリュームよりもはるかに大きいことを思い出してください)明るい色。つまり、フィルターを調整して、表現されていない色に対する誤った応答がないようにすることは、基本的に不可能です。 後者は、周囲に多くの白がある雪道でオブジェクトを検索する場合に特に顕著です。 したがって、追加のコンテキストに従って、3つの結果のいずれかが選択されます。
もう少し詳しく:
私の場合
-結果の差を計算し、それが大きい場合(2.5倍以上)-最初の結果を出力します
-フレアと雪を計算します。 これを行うために、色補正を実行し、計算を繰り返します。
-背景色に割り当てられた重みを減らすために、画像内のオブジェクトの予想される位置に関する情報を使用します。
「間違った」画像の例:
-結果の差を計算し、それが大きい場合(2.5倍以上)-最初の結果を出力します
-フレアと雪を計算します。 これを行うために、色補正を実行し、計算を繰り返します。
-背景色に割り当てられた重みを減らすために、画像内のオブジェクトの予想される位置に関する情報を使用します。
「間違った」画像の例:
現在、照明の違いは、同じ色のオブジェクトの認識を依然として非常に妨げています。 場合によっては、色補正が適切ですが、時には無力な場合があります-灰色が白、黒が点灯-灰色または白になります。
これを行うには、オブジェクトに関する情報を使用します(前のフレームのいずれかで色で区別し、シャドウまたはハイライトがどのように点滅するかを追跡します)。 決定された色に投票したすべてのピクセルを読み取ります。 そして、それらの平均値を考慮します。 オブジェクトの基本色を取得し、可能な変更のパレットを作成します。
非常に重要なこと:色は、人の知覚に一致するようにモニターによって再現されます。 したがって、再生デバイス自体の後の色データの保存はユーザーの目に対して最適化されており、RGB値は知覚する色のこれらの色の実際のシェアに対応していません(反射光の広いスペクトルを見て、3つの基本色すべてがそれらに配置されていることを確認できます)
したがって、基本色を他の色と混ぜてグレアをテストするには、すべての手順を開始する前にRGB値を二乗し、最後にルートを取得する必要があります。 その後、HLSに翻訳し、色の変化を確認しました。 基本色を取得し、黒、白、赤、青、緑、および最初のアルゴリズムで決定されたメインセットの色と順番に混合しました。 その後、手順を数回繰り返して、各オプションのいくつかのグラデーションを取得しました。 1/30および1/24の頻度と比較するために、2回しか反復できません-これで十分です(安全のために最も遠い値を削除することもできます-値は確実に一致します)。
次に、ハッシュ関数のようなものが行われます-パレット内の色の間の距離が取られます(距離L1-L2 + G1-G2を取りました。この奇妙なメトリックは実験でよく表れたため、RGBとHLSの違いを組み合わせて試す価値があります)次に、降順でソートされたリストに配置されます。
自動生成されたパレットの例(異なる色のオブジェクトのシステムでは、すべてのパレットが最適化のために1つに結合されましたが、シリーズは1つのオブジェクトのみに属する色に対してのみ計算されました):
同じ手順が新しいフレームで実行され、しきい値未満の差内で一致する距離が検索されます。 次に、リスト内の一致する差異の最長チェーンの長さは、それが同じ色であるが、突然のグレア/シャドウがあるか、同じでないかを示します。 パレットで色を混合するための3つの原色として、RGBではなく、人工光源の一般的な色に応じて、青の代わりにわずかに紫、緑の代わりに黄色を使用できます。
その後、特定のタスクのしきい値を調整する必要があります。
最終テストの写真はありませんが、最終的に同じドレスをアルゴリズムにロードし、 「白」と「黄色」になりました。
それで、一番下の行は何ですか?
- 色を決定するには、次の3つの手順を実行することをお勧めします。色をどのように知覚するかに関する研究から初期係数を取得します。
- Googleの一連の画像を操作して、大まかな調整を行います。
- プログラムが動作するタイプの一連のテストイメージを実行し、微調整を実行します。
- エラーの数を減らすには、フォームのコンテキストを調べて、追加の色補正を実行する必要があります。
- 照らされたオブジェクトを区別するには、まずハイライト/シャドウの後に推定色のパレットを作成し、それを簡単な方法で比較する必要があります。
注意する価値のあるポイント:
- カメラのフレームには、各ピクセルごとに異なるRGB値の歪みがあります。
- 場合によっては、追加の4番目のチャネルが追加されます。これは、書かれていませんが、プログラムから見えてきます。
- モニター上の値は正しいですが、保存されていませんが、実際の値のルートに比例した歪んだ座標です。
ここで、そのようなことを適用して、それで遊ぶことができる場所について:
- 個人認識システムでは、個人の顔に加えて、お気に入りのTシャツの体格、バッグ、色に関する情報をデータベースに入力できます。
- トラッカーでは、粗い初期フィルターの代わりとして(拡散値によるなど)。
- マニピュレータによってキャプチャされる異種オブジェクトを検索する技術。
- 既に特定の範囲の色に縮小された熱画像と振動画像のセグメンテーション。
- なんでも! コンピューターは色を人として区別します。 便宜上、計算されたラベルと平均色、およびいくつかのサービスコードを返すことができます。 Vec3b出力フォーマットを使用し、このタイプを少しカスタマイズして、ここで認識エラーと回答の信頼度を渡しました。
ここから色でマークされた画像