プロが教えるわが家の防犯対策術!

今、画像を使用して色を判断するプログラムを開発しています。

今日、カメラから取り入れた画像の比較したい部分のマスターとターゲットのRGB毎の平均レベルを出せる様に成りました。
これで色の判別をしたいのですが、何か良い方法、定番等ありますでしょうか。

今はR/G G/B B/Rをマスター領域とターゲット領域で計算し、各々の差の合計を使って出来ないかと考えて居ます。
即ち、マスターのR/G とターゲットのR/G の絶対差、マスターのG/B とターゲットのG/B の絶対差、マスターのB/R とターゲットのB/R の絶対差の合計です。

ちょっとやって見ると、色が似ていると少ない値が得られる様です。

ただ、自己流なので、何か定番があればお教え下さい・・・と行っても、インテグラムとかシグマが入った式だと全然理解出来ず、算数レベルで何かありませんでしょうか。

よろしくお願い致します。

A 回答 (4件)

そういうことであれば



例えばその6種類の中から一番近い色を選ぶ
とすればいいという事ですよね?

なのでRやBを割り算するよりも
距離の式を3次元(RGB)に拡張した式が
「論理的にそのまんま」なんで
確実性が高いんじゃないでしょうか

マスターを色1(R1,G1,B1)
ターゲットを色2(R2,G2,B2)
とすると

色の距離 = sqrt( ( R1 - R2 ) * ( R1 - R2 ) + ( G1 - G2 ) * ( G1 - G2 ) + ( B1 - B2 ) * ( B1 - B2 ) );

になるので、こいつが一番小さくなるやつを選んでやればいいんではないかと思います。
    • good
    • 0
この回答へのお礼

LongSecret様、いつもお世話に成ります。

前回のフレームレートはお手上げで保留にしています。

>色の距離 = sqrt( ( R1 - R2 ) * ( R1 - R2 ) + ( G1 - G2 ) * ( G1 - G2 ) + ( B1 - B2 ) * ( B1 - B2 ) );

色の距離で判断ですね。差の二乗の合計の平方根、この辺りなら私にも理解出来そうですし、私のレベルでもプログラム化出来ると思います。

月曜に会社で動作を調べてみます。

ありがとう御座いました。

お礼日時:2012/02/19 08:20

あ、一応



比較するだけなら

a <= b (両方実数でa>=0かつb>=0)
のとき
√a <= √b

はいつも成り立つので、この場合
sqrtは外せますね。

色の距離の2乗 = ( R1 - R2 ) * ( R1 - R2 ) + ( G1 - G2 ) * ( G1 - G2 ) + ( B1 - B2 ) * ( B1 - B2 );

実装上はこれを比較すれば良いかと
    • good
    • 0
この回答へのお礼

今、エクセルで計算してみました。
各色のレベル差にきれいに反応していました。
実際は得られた数値を442(=255*255*3のルートの近似値)で割った数値をパーセントとして利用したいと考えて居ます。

ありがとう御座いました。

お礼日時:2012/02/19 09:12

どうもこんばんは。



お力になれるかは分かりませんが
詳しい人がいても情報が足りないと答えられない可能性がありますので

>色の判別

といいますのは、具体的にはどういう内容なのでしょうか

・画像全体の話か(あるいは特定のピクセルか)
・それとも特定の大きさを持った領域ごとの、周囲との変化量の話か
・ここでいうマスターとターゲットとは具体的にそれぞれどういうものなのか

・「現在の計算式」とはどのような感じなのか

つまり

>R/G G/R G/B B/G B/R R/B のマスターとターゲットの差の絶対値の合計。
>これを1024で割ると0から100の数に成りそうで、0に近い程マスターとターゲットの色味が似ているのでは無いかと考えています。

なぜ、そうなるのか(各RGBのとり得る最小値と最大値は何かとかも)
等の情報が必要なのではないかと思います。


なお、No.1さんの回答のHSVの計算式は、一応算数レベルの計算ではあります。
例としてはこんな感じです。

・書く色は0から1.0までの間にとります。
(もし最大値が255で最小値が0とかだったら、255.0で割るなど)

double r, g, b;

//この隙間で0から1.0になるように代入する

double max = r > g ? r : g;
if ( max < b ) max = b;

//以下、同様にしてmin(最小値)も求める。

・色相(Hue)は

const double d = max - min;
double hue;

if ( r == max ) hue = 60 * ( g - b ) / d;
else if ( g == max ) hue = 60 * ( b - r ) / d + 120;
else hue = 60 * ( r - g ) / d + 240;


こんな感じで求まります。(maxとminが同じだった場合0で割ってしまうのでそこはもうちょっと書き足してください)


彩度(Saturation・Chroma)
明度(Brightness・Lightness・Value)

については遥かに簡単なので割愛します。


色相(Hue)とは


 赤


の円を描いたときに
赤を基点(0度)とする
反時計回りの角度、という感じのイメージです。


こちらをご覧いただければお分かりいただけるかなと
http://www.parof.jp/Misc/HSV/

この回答への補足

ご回答有難う御座います。

>具体的にはどういう内容なのでしょうか

マスター、ターゲット共に矩形領域が設定されています。
矩形領域の色は原則均一ですが、照明が悪いので多少ばらつきがあります。
今はこの領域、R、G、Bで領域内の平均レベルを算出出来る様に成った状態です。

このマスターとターゲットの色が同じであるかどうかの判別です。
矩形領域は例えば部品の色やラベルの色の所に割り当てられていると考えて下さい。
ターゲットの色とマスターの色が同じならOK、違って居ればNG判定をします。
ただ、色は中間色では無く、R G B や Y M C レベルの色が判断出来ればいいのです。

要は部品の色の付け間違いを判断したいのです。

ただ、私自身は余り画像処理系は分からないので、難しい事を言われても残念ながら分から無いのです。

逆に質問させて頂ければ、私が考えた R/G G/R G/B B/G B/R R/G の比率のマスターとターゲットの差の絶対値の和を1024で割った値がこの判断に使えるかどうかを検討して頂けたら幸いです。

例えば マスター、ターゲット共に赤系だとします。

マスターが R:200 G:50 B:40 ターゲットが R:220 G:60 B:50とします。
すると
マスターのR/G G/R G/B B/G B/R R/G は各々4.00 0.25 1.25 0.80 0.20 5.00 と成り
ターゲットは 3.67 0.27 1.20 0.83 0.23 4.40 と成ります。
この値のマスターとターゲットの差の絶対値は各々0.33 0.05 0.05 0.03 0.03 0.60と成ります。
この数値の合計は1.07と成ります。これを1024で割ると0.1%と成ります。
これを色々な色レベルで計算して見ると、数値が少ないと色が似ている、大きいと色が似ていないと成らないでしょうか。

補足日時:2012/02/18 23:20
    • good
    • 0

定番といえば、HSV色空間か何かに変換して色相の差の絶対値を取るのが一般的かもね。


変換式は、Wikipedia に載ってるので十分。

参考URL:http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9% …
    • good
    • 0
この回答へのお礼

ご回答ありがとう御座います。
ただ、ちと私には難し過ぎて分かりません。
色相の差ならば今やろうとしている各画像レベルの差の絶対値でも何とか行けそうですよね。
昨日、試算して居て、先の式に追加して、全ての差を取ってみようと思って居ます。
即ち、R/G G/R G/B B/G B/R R/B のマスターとターゲットの差の絶対値の合計。
これを1024で割ると0から100の数に成りそうで、0に近い程マスターとターゲットの色味が似ているのでは無いかと考えています。
更にこれだとマスター画像とターゲット画像の明るさが異なっても比較出来そうです。

お礼日時:2012/02/18 17:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!