문제
내가 찾는 함수에 대한 시도를 어떻게 정량화하는 방법"먼"(또는 뚜렷한)두가지 색깔 있다.이 질문은 정말에서 두 개의 부품:
- 어떤 색상 공간 최고의를 나타내는 인간의 비전을 보여 주고 있는가?
- 거리 측정 그 공간에서 가장 잘 나타내는 인간의 시각(유클리드?)
해결책
변환 La*b*(aka 그냥 평범"Lab",그리고 당신은 또한 대한 참조를 참조하십시오"CIELAB").좋은 빠른 measaure 색상의 차이가
(L1L2)^2+(a1-a2)^2+(b1-b2)^2
색상 과학자들은 다른 좀 더 세련된 조치는 가치가 되지 않을 수도 있습니다,귀찮게에 따라 정확도를 위해 필요합니다.
이 a
고 b
값을 나타내는 반대하는 색상과 유사한 방법에 있는 방법 콘 작업,그리고할 수 있 부정적이거나 긍정적이다.중성 색상 백색,회색이 a=0
,b=0
.이 L
은 밝기에 정의된 특정한 방법으로,제로(순수한 어둠)까지 어떤 것이다.
원유 설명:>>주어진 색깔,우리의 눈을 구분 사이에 두 개의 넓은 범위의 파장에-파랑 대 이상 파장.그리고,덕분에 더 많은 최근의 유전자 돌연변이,더 이상 파장 콘 두 갈래 두 가지로 구분,우리를 위해 빨간 대녹색입니다.
그런데,그것은 것에 대한 경력을 상승 당신의 색깔에 원시인 동료들의 알만"RGB"또는"CMYK"에 대한 좋은 장치에 빨아에 대한 심각한 인식을 작동합니다.일했을 위한 영상 과학자들은 몰랐다는 것은 이 물건에 대해!
더 많은 재미를 위해 독서 색상 차이를 이론,try:
- 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..)을 계산하는 방법을 최적의 컬러는 거리,그리고..가장 과학적으로 정확한 하나: deltaE 에서 2RGB(!) 를 사용하여 값을 OpenCV:
이 필요 3 색상 공간의 변환+일부 코드에서 변환을 자바스크립트(http://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 는 첨가제하고 감산 모델을 각각 모델링하는 방식은 기본 색상 빛나 안료(각각)에 결합하여 새로운 색상을 혼합하는 경우.
이 에서 문제가 되는 색상의 차이 목록의 수색 공간과 거리를 측정하도록 설계 동의와 인간의 지각의 색상 거리를 지원합니다.
스팸처럼 보이지만,이 링크는 정말 흥미로운 색깔을 위한 공간:)
가장 쉽 거리 것 물론을 고려한 색상으로 3d 벡터에서 발생하는 동일한 원산지와 사이의 거리도 있습니다.
필요하신 경우에는 등의 요소를 고려하는 그린에서 더 유명하다 판단 강도,당신은 당신의 값이 있습니다.
ImageMagic 제공하는 다음의 것:
- 빨간색:0.3
- 녹색:0.6
- 색:0.1
물론,다음과 같은 문법을 이용하여 값만 의미와 관련하여 다른 값을 다른 색깔로 뭔가 의미 있는 것은 인간에게,그래서 모두 사용할 수 있습니다 값을 것 similiarity 주문.
글로,첫 번째 포인트의 전화,나는 말의 일반적인 메트릭 HSV(색조,채도,값)또는 HSL 은 더 나은 대표자의 인간이 어떻게 인식 컬러보다는 말 RGB 또는 CYMK.보 HSL,HSV Wikipedia.
나 순진하게도 나는 플롯한 포인트에서 HSL 공간에 대한 두 개의 색상과 계산의 규모 차이를 벡터입니다.그러나 이는 밝은 노란색과 밝은 녹색으로 간주 것만큼 다른 녹색 어두운 녹색입니다.하지만 그런 많은 빨간색과 핑크 두 개의 서로 다른 색상.
또한,차이는 벡터와 동일한 방향에서 이 매개 변수는 공간이 같지 않습니다.예를 들어,인간의 눈을 선택 녹색보다 훨씬 더 다른 색상.변화에서 색조에서 그린에 의해 동일한 금액으로 교대에 붉은 보일 수 있다.도에 변화의 채도에서 작은 금액을 제의 차이점은 회색,분홍색,다른 곳에서 shift 것 사이의 차이는 두 개의 그늘이 빨간색입니다.
에서 프로그래머의 포인트 볼,당신은 것이를 그리는 데 필요 벡터 차이나 수정에 의해 비례 행렬하는 것을 조정 길이에 따라 여러 지역에서의 HSL 공간이 상당히 임의 것 기반으로 다양한 컬러의 이론 아이디어만 있을 쥐게는 상당히 임의로 하는 것에 따라 신청하고 싶어합니다.
더 나은,당신은 당신이 볼 수있는 경우에는 사람은 이미 그런 일이다.
는 사람으로 컬러 블라인드 나는 그것을 믿는 것은 좋을 더 추가하려고 하는 분리한 다음 정상적인 비전입니다.가장 일반적인 형태의 색맹은 빨강/녹색분이 포함되어 있습니다.는 것을 의미하지 않는 당신이 볼 수 없는 빨강,녹색,그것이 의미하는 것이 더 어렵다는 것을 보고 더 어려운 차이점을 확인해 보십시오.그래서 큰 분리하기 전에 컬러 블라인드는 사람의 차이를 말할 수 있다.