質問
解決
に変換するラ*b*(通称だの"研究室"いま"を参考にCIELAB").良いクmeasaureの色差は
(L1-L2)^2+(a1-a2)^2+(b1-b2)^2
色の科学者はより洗練された措置を与える恐れがあるためにわざわざによっては、精度が必要だしています。
の a
や b
値を表すのに反対色と同様にコーンの仕事は、負しております。ナチュラルカラー-白、グレーにして a=0
,b=0
.の L
は明るさの定義において特定の方法では、ゼロ(純闇)である。
原説明>>た色目と二つの広い範囲の波長の青色vs波長が長くなるほど小さくなり.そして、最近の遺伝子変異の長波長円錐二股間の識別用に赤前グリーン。
ようになるでしょうあなたのキャリア以上のお色caveman collegues知っている人だけの"RGB"または"CMYK"のカバーレターなどの機器で吸引深刻な感覚です。働いてきた画像科学者を知らなかったか、このチャンスが得られます。
し、さらに楽しく読色差理論してみ:
- http://white.stanford.edu/~brian/scielab/introduction.html 情報
- リンク色の理論一般、websurf始 http://www.efg2.com/Lab/Library/Color/ や
- http://www.poynton.com/Poynton-color.html
より詳細な研究室 http://en.kioskea.net/video/cie-lab.php3 できないこの時期を見つ非醜いるページであったが、実際には、変換関数が思いのまま編集この答えを含めます。
他のヒント
としてcmetric.htm 上記リンクに失敗した私にとって、他の多くの実装カラー距離た後もjurney..)の計算方法は、良好なカラー距離、..最も科学的に正確に一: δe から2RGB(!) 値OpenCVを使用して:
これに必要な3色空間変換+一部のコード変換からjavascripthttp://svn.int64.org/viewvc/int64/colors/colors.js)をC++
最後に、コードのう箱から出してすぐに、希望のない一つの深刻なバグがあ---うですが微細な多数の試験)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/photo/photo.hpp>
#include <math.h>
using namespace cv;
using namespace std;
#define REF_X 95.047; // Observer= 2°, Illuminant= D65
#define REF_Y 100.000;
#define REF_Z 108.883;
void bgr2xyz( const Vec3b& BGR, Vec3d& XYZ );
void xyz2lab( const Vec3d& XYZ, Vec3d& Lab );
void lab2lch( const Vec3d& Lab, Vec3d& LCH );
double deltaE2000( const Vec3b& bgr1, const Vec3b& bgr2 );
double deltaE2000( const Vec3d& lch1, const Vec3d& lch2 );
void bgr2xyz( const Vec3b& BGR, Vec3d& XYZ )
{
double r = (double)BGR[2] / 255.0;
double g = (double)BGR[1] / 255.0;
double b = (double)BGR[0] / 255.0;
if( r > 0.04045 )
r = pow( ( r + 0.055 ) / 1.055, 2.4 );
else
r = r / 12.92;
if( g > 0.04045 )
g = pow( ( g + 0.055 ) / 1.055, 2.4 );
else
g = g / 12.92;
if( b > 0.04045 )
b = pow( ( b + 0.055 ) / 1.055, 2.4 );
else
b = b / 12.92;
r *= 100.0;
g *= 100.0;
b *= 100.0;
XYZ[0] = r * 0.4124 + g * 0.3576 + b * 0.1805;
XYZ[1] = r * 0.2126 + g * 0.7152 + b * 0.0722;
XYZ[2] = r * 0.0193 + g * 0.1192 + b * 0.9505;
}
void xyz2lab( const Vec3d& XYZ, Vec3d& Lab )
{
double x = XYZ[0] / REF_X;
double y = XYZ[1] / REF_X;
double z = XYZ[2] / REF_X;
if( x > 0.008856 )
x = pow( x , .3333333333 );
else
x = ( 7.787 * x ) + ( 16.0 / 116.0 );
if( y > 0.008856 )
y = pow( y , .3333333333 );
else
y = ( 7.787 * y ) + ( 16.0 / 116.0 );
if( z > 0.008856 )
z = pow( z , .3333333333 );
else
z = ( 7.787 * z ) + ( 16.0 / 116.0 );
Lab[0] = ( 116.0 * y ) - 16.0;
Lab[1] = 500.0 * ( x - y );
Lab[2] = 200.0 * ( y - z );
}
void lab2lch( const Vec3d& Lab, Vec3d& LCH )
{
LCH[0] = Lab[0];
LCH[1] = sqrt( ( Lab[1] * Lab[1] ) + ( Lab[2] * Lab[2] ) );
LCH[2] = atan2( Lab[2], Lab[1] );
}
double deltaE2000( const Vec3b& bgr1, const Vec3b& bgr2 )
{
Vec3d xyz1, xyz2, lab1, lab2, lch1, lch2;
bgr2xyz( bgr1, xyz1 );
bgr2xyz( bgr2, xyz2 );
xyz2lab( xyz1, lab1 );
xyz2lab( xyz2, lab2 );
lab2lch( lab1, lch1 );
lab2lch( lab2, lch2 );
return deltaE2000( lch1, lch2 );
}
double deltaE2000( const Vec3d& lch1, const Vec3d& lch2 )
{
double avg_L = ( lch1[0] + lch2[0] ) * 0.5;
double delta_L = lch2[0] - lch1[0];
double avg_C = ( lch1[1] + lch2[1] ) * 0.5;
double delta_C = lch1[1] - lch2[1];
double avg_H = ( lch1[2] + lch2[2] ) * 0.5;
if( fabs( lch1[2] - lch2[2] ) > CV_PI )
avg_H += CV_PI;
double delta_H = lch2[2] - lch1[2];
if( fabs( delta_H ) > CV_PI )
{
if( lch2[2] <= lch1[2] )
delta_H += CV_PI * 2.0;
else
delta_H -= CV_PI * 2.0;
}
delta_H = sqrt( lch1[1] * lch2[1] ) * sin( delta_H ) * 2.0;
double T = 1.0 -
0.17 * cos( avg_H - CV_PI / 6.0 ) +
0.24 * cos( avg_H * 2.0 ) +
0.32 * cos( avg_H * 3.0 + CV_PI / 30.0 ) -
0.20 * cos( avg_H * 4.0 - CV_PI * 7.0 / 20.0 );
double SL = avg_L - 50.0;
SL *= SL;
SL = SL * 0.015 / sqrt( SL + 20.0 ) + 1.0;
double SC = avg_C * 0.045 + 1.0;
double SH = avg_C * T * 0.015 + 1.0;
double delta_Theta = avg_H / 25.0 - CV_PI * 11.0 / 180.0;
delta_Theta = exp( delta_Theta * -delta_Theta ) * ( CV_PI / 6.0 );
double RT = pow( avg_C, 7.0 );
RT = sqrt( RT / ( RT + 6103515625.0 ) ) * sin( delta_Theta ) * -2.0; // 6103515625 = 25^7
delta_L /= SL;
delta_C /= SC;
delta_H /= SH;
return sqrt( delta_L * delta_L + delta_C * delta_C + delta_H * delta_H + RT * delta_C * delta_H );
}
希望で人:)
HSL、HSVより人間の色との認識を示した。による Wikipedia:
ることもあり好と美術資料デジタル化画像、その他のメディアの利用にはHSVはHSLの色モデルのモデルなどのRGB以CMYKの違いによる方法のモデルを見習う、人の自然色です。RGBとCMYKが添加減算モデルは、それぞれ、モデリングの原色に点灯または顔料(それぞれを組み合わせた新色が混ぜ合わせます。
の Wikipediaの記事の色違い リストのカラースペースと距離指標の設計に合致する人間の知覚の彩ります。
あるスパムがこのリンクは本当に興味深い色空間:)
最も簡単な 距離 もちろんのことだけを考えてデザイン-インスタレーション3dベクトルから同じ原産地との距離を最終的な点です。
が必要な場合は、このような要因に緑がより明確な判断強度で計量できる値です。
ImageMagic 以下のスケール:
- 赤:0.3
- 緑:0.6
- 青:0.1
もちろん、価値観のようなことにのみ意味を持つ可能性がある関係その他の価値観その他の色としても意味のある人、ことができるすべての利用価値がsimiliarityに商品を発送致します。
その最初の呼んからの指示に従うことが共通のメトリックHSV(色相、彩度、値)またはHSLより代表の人間がどのように知覚色のようなRGBやCYMK.見 HSL,HSVをWikipediaで調べる.
と思いnaivelyいプロットのポイントは、HSLの空間の色の大きさを計算に差ベクトルとなっています。しかしこの明るい黄色、明るい緑色であると考えられるだけでなくなる緑暗緑です。その後は多くの検討赤やピンクの異なる二つのです。
また、差分ベクトルを同じ方向にこのパラメータ空間は同じです。例えば、人の眼を拾緑のほうが良いのです。変色から緑が同額としてシフトからの赤いようになります。もシフト彩度から少量ゼロの違いはグレー、ピンク、他の国にシフトするのは色の赤です。
からのプログラマ視すれば安定性がさらに向上プロットに差ベクトルが変更による比例を思料するマトリクスが調整の長さにそのためのさまざまな地域のHSLスペース-このような恣意的情報が観測できた様々な色彩理論のアイデアが工夫かなり任意に変えたい本です。
できれば誰でもで行うオンライン...
人に何かすることができましたが、盲ているのだと思いますように追加分離して通常のビジョンです。で最も一般的な色盲には赤色/緑色の欠乏状態にあるといえるこえてくるということではないですが見えない赤または緑でいう意味がこめられているというより見えにくい、より見えにくい、この相違を明確にする。それより大きな分離の前には色盲人がいには差額をいただきます。