• ベストアンサー

3つの値を1つの値に

今色を使ったプログラムを組んでいて、RGBの3値を利用しています。 例えば R:157 G:0 B:0 と R:0 G:0 B:157 これらのRGB値を1つの値に計算し、 二つが違う色であることを判別したい場合 どのような計算方法を利用すればいいでしょうか。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.1

R,G,Bの値の範囲が0~255である場合、 10進数で計算するなら下記などはいかがでしょうか。 COL = R * 1000000 + G * 1000 + B ただしこれだと桁数が異常に大きくなるのと、16進数の方が色々扱いやすいので、 COL = R * 10000H + G * 100H + B の方が良いかもしれませんね。 COLから各色を抽出するにも16進数の方が便利でしょう。 ご参考に。

mitti0157
質問者

お礼

参考にさせて頂きます。 お二方、早々と返答ありがとうございました。

その他の回答 (1)

  • lisyaoran
  • ベストアンサー率50% (202/397)
回答No.2

前の方が仰る通り、16進数8bitで扱うのが望ましいかと思います。 例1は9D0000 例2は00009D となるため、簡単に比較することができます。

関連するQ&A

  • 色の判定

    今、画像を使用して色を判断するプログラムを開発しています。 今日、カメラから取り入れた画像の比較したい部分のマスターとターゲットのRGB毎の平均レベルを出せる様に成りました。 これで色の判別をしたいのですが、何か良い方法、定番等ありますでしょうか。 今はR/G G/B B/Rをマスター領域とターゲット領域で計算し、各々の差の合計を使って出来ないかと考えて居ます。 即ち、マスターのR/G とターゲットのR/G の絶対差、マスターのG/B とターゲットのG/B の絶対差、マスターのB/R とターゲットのB/R の絶対差の合計です。 ちょっとやって見ると、色が似ていると少ない値が得られる様です。 ただ、自己流なので、何か定番があればお教え下さい・・・と行っても、インテグラムとかシグマが入った式だと全然理解出来ず、算数レベルで何かありませんでしょうか。 よろしくお願い致します。

  • 16進数で表現される色をRGB値になおす計算

    例えば、「#F30485」という色を出したいとき、RGB値になおす場合計算方法は、 「0~9」の値はそのままで、「A~F」は「A=10」「B=11」「C=12」「D=13」「E=14」「F=15」として、2桁ずつそれぞれR・G・Bの値なので、R値は「15*16+3=243」、G値は「0*16+4=4」、B値は「8*16+5=133」で、「rgb(243,4,133)」。 つまり、計算式は、 「それぞれの最初の桁の数字*16+それぞれの2番目の桁の数字」 ということで合っているでしょうか? 回答よろしくお願いします。

    • ベストアンサー
    • HTML
  • 画像のRGBの値

    画像フィルタが必要になり、そのために画像の性質を知るために、画像のRGBの値を直接求めようと思いました。 具体的には、画像ファイル(BMP)があり、その画像の全画素のRGBの値をテキストファイル(CSV形式)に変換したいのです。そのようなツールありますか? 特殊な用途なので、 while(getpixel(r,g,b)) { printf("%d,%d,%d\n",*r,*g,*b); } のようなプログラムを書かないといけないと思うのですが、「BMPファイルの先頭から順番に画素のRGBの値を持ってくる関数getpixel」が書けません。

  • VBAでスクロールバーを動かしても値が変わらない

    図のようなスクロールバーを動かして、それぞれの値と、A4のセルの色が変わるものを作りたいのです。 プログラムは、 Sub スクロール1_Change() R = Range("C2").Value G = Range("D2").Value B = Range("E2").Value Range("A4").Interior.Color = RGB(R, G, B) End Sub Sub スクロール2_Change() R = Range("C2").Value G = Range("D2").Value B = Range("E2").Value Range("A4").Interior.Color = RGB(R, G, B) End Sub Sub スクロール3_Change() R = Range("C2").Value G = Range("D2").Value B = Range("E2").Value Range("A4").Interior.Color = RGB(R, G, B) End Sub ですが、スクロールバーに関連付けられていないようです。基本ですみませんが、関連付けるにはどうすればいいのでしょうか。

  • ピクセルの値から画像

    画像をRGB値の値で表す1次元配列を作ったのですが、それを今度は逆のことをしたいのですがよくわかりません。アドバイスお願いします。画像は白黒でR=G=Bです。

  • RGBの色を混ぜるとは計算上どうなるのですか?

    池谷裕二さんのHPで自己組織化マップSOM の説明がわかりやすく書いてあります。 http://gaya.jp/spiking_neuron/som.htm そこで、同じ手順で自己組織化のシミュレーションをプログラミングしたのですが、 沢山のマス目の一つを選択してその周辺の8個のマス目を新しく作った色に   「そのマスの周囲にも、少しだけ■を混ぜてやる。」 これが具体的にどんな計算なのかが分からずうまく自己組織化しません。HPの例から 画像ソフトに貼り付けてRGBを読むと  染める色(紺色)       染められる色          結果の色 (R000 G000  B153) + (R000 G016  B255) =(R000 G009  B255)  青っぽいマス  (R000 G000  B153) + (R164 G255  B000) =(R105 G255  B150)  緑っぽいマス (R000 G000  B153) + (R255 G013  B000) =(R161 G255  B000)  赤っぽいマス (R000 G000  B153) + (R052 G255  B203) =(R000 G184  B255)  水色っぽいマス とこんな計算結果らしいのです。アルゴリズムが読めませんのであれこれ試してみました。 一色の強さ0~255までという限度がありますから単純に足すとたいがいの場合、RGBどの色かがオーバーフローします。それを単純にはみ出ただけ足切りしてもだめ。(上記の計算結果もそうなっていません)傾向が反映されたらとRGBを定数で割り算して加えると盤面全体がグレーに限りなく近づいてしまいます。 何とか自然に自己組織化するところがもっと多いマスで見たいのですが、「マス目にちょっと絵の具を垂らす。」ことをどのように計算式で表すのか、、、、ご存じの方、教えていただけませんか。

  • BMP画像ファイルの読み書き

    Visual StudioのC言語により、ビットマップ形式の画像に対するプログラミングで 簡単な背景差分のプログラムを作成しています。 背景画像と対象画像2枚を読み込み色の差を取り、 差の値が背景の値と近ければ背景とみなし白で塗りつぶし、 物体だけを表示した画像を生成するようなプログラムです。 1枚のみの画像は以下のプログラムで作動しますが、連続した画像(01.bmp 02.bmp ・・・・100.bmp) を読み込み上記の処理をする場合にはどうすればよいのでしょうか? 分かりにくくて申し訳ないですが、よろしくお願いします。 #include "BMPData.h" #include <math.h> int main(){ int a=150; int i,j; int r,g,b; int ir,ig,ib; int diff; BMPStruct bmp_bg; BMPStruct bmp_oj; BMPStruct bmp; RGB rgb_bg; RGB rgb_oj; RGB rgb; RGB rgb_w; rgb.r = 255; rgb.g = 255; rgb.b = 255; rgb_w.r = 0; rgb_w.g = 0; rgb_w.b = 0; readBMP(&bmp_bg, "back.bmp"); //背景画像の読み込み readBMP(&bmp_oj, "01.bmp"); //対象画像の読み込み makeBMP(&bmp,640, 480, rgb); //出力用画像を生成する for(i=0; i<640; i++){ for(j=0; j<480; j++){ getColor(bmp_bg, &rgb_bg,i,j);  //背景画像の色を取得 getColor(bmp_oj, &rgb_oj,i,j);  //対象画像の色を取得 //rgbそれぞれの値の差 r = rgb_bg.r - rgb_oj.r; g = rgb_bg.g - rgb_oj.g; b = rgb_bg.b - rgb_oj.b; //絶対値 ir = abs(r); ig = abs(g); ib = abs(b); //色の差 diff = ir + ig + ib; //背景かどうかの判定 if(diff>a){ putColor(bmp, rgb_w, i, j); //色の差が大きければ出力画像に対象画像の色をそのまま出力 } else{ putColor(bmp, rgb, i, j); //色の差が小さければ白を出力 } } } writeBMP(bmp, "image01.bmp"); }

  • RGB値にちかいCMYKの値?を知りたいのです。

    RGB値にちかいCMYKの値(?)を知る方法はないでしょうか。 DTPデザイナーさんに作ってもらったロゴで使われているのと同じか似た色を使って、企画書などを作りたいのですが、イラストレーターで調べられるのはCMYKの値だけのようです。ワードなどでも使えるよう、RGB値か16進数の番号を知りたいのです。 もし手法などございましたら是非教えて頂けませんでしょうか。 よろしくお願い致します。

  • 二つの色を混ぜてできる色はどんな色?

    windows2000 PhotoShopCS 例えば(1)の色を R:200 G:100 B:50 とします。 (2)の色を R:100 G:150 B:200 とします。 (1)と(2)の色を混ぜるとRGBの数値はそれぞれいくらになるかを計算してくれるオンラインソフトはないものでしょうか? PhotoShopの描画色と背景色を混ぜると「こんな色になります」という事を知りたいのです。

  • 対話型遺伝的アルゴリズムについて。

    対話型遺伝的アルゴリズムについて。 現在,IGAを用いたアプリケーションを構築するための勉強をしている者です。 進化計算処理の一つ,「交叉」について2つ疑問があります。 <質問1>=============================== 例えば, 「ユーザに好きな色を評価してもらいながら最適な色(好みの色)を作り出してもらう」 「パラメータはRGB3原色の3つ」 とするとき,評価及び進化計算の過程でRGBの値が 親1 R=63 G=127 B=255 親2 R=50 G=240 B=0 の親があったとします. これを以下のように,10進数のまま交叉するというのではだめなのでしょうか。 親1 R=63 G=127 <交叉位置> B=255 親2 R=50 G=240 <交叉位置> B=0          ↓ 子1 R=63 G=127 B=0 子2 R=50 G=240 B=255 もちろんこれだと2進数化(コード化)した時とは違い,各原色はそっくりそのまま入れ換えることになります。 ただ,それでも最適解へ収束するということには変わらないと思います。 従来の2進数にコード化して行う明確な理由を教えて頂けないでしょうか。 <質問2>=============================== 上記のアルゴリズムであれば, 整数である「表現型」のままの交叉ということになるのでしょうか。 もしそうであれば,ここは従来の交叉は使えず「実数値GA」なるものを使わなければいけないのでしょうか。 ==================================== 以上2点です。 どちらか1つの回答でも結構です。 どうぞ,よろしくお願いします。