문제

원래 질문

내가 찾는 함수에 대한 시도를 어떻게 정량화하는 방법"먼"(또는 뚜렷한)두가지 색깔 있다.이 질문은 정말에서 두 개의 부품:

  1. 어떤 색상 공간 최고의를 나타내는 인간의 비전을 보여 주고 있는가?
  2. 거리 측정 그 공간에서 가장 잘 나타내는 인간의 시각(유클리드?)
도움이 되었습니까?

해결책

변환 La*b*(aka 그냥 평범"Lab",그리고 당신은 또한 대한 참조를 참조하십시오"CIELAB").좋은 빠른 measaure 색상의 차이가

(L1L2)^2+(a1-a2)^2+(b1-b2)^2

색상 과학자들은 다른 좀 더 세련된 조치는 가치가 되지 않을 수도 있습니다,귀찮게에 따라 정확도를 위해 필요합니다.

ab 값을 나타내는 반대하는 색상과 유사한 방법에 있는 방법 콘 작업,그리고할 수 있 부정적이거나 긍정적이다.중성 색상 백색,회색이 a=0,b=0.이 L 은 밝기에 정의된 특정한 방법으로,제로(순수한 어둠)까지 어떤 것이다.

원유 설명:>>주어진 색깔,우리의 눈을 구분 사이에 두 개의 넓은 범위의 파장에-파랑 대 이상 파장.그리고,덕분에 더 많은 최근의 유전자 돌연변이,더 이상 파장 콘 두 갈래 두 가지로 구분,우리를 위해 빨간 대녹색입니다.

그런데,그것은 것에 대한 경력을 상승 당신의 색깔에 원시인 동료들의 알만"RGB"또는"CMYK"에 대한 좋은 장치에 빨아에 대한 심각한 인식을 작동합니다.일했을 위한 영상 과학자들은 몰랐다는 것은 이 물건에 대해!

더 많은 재미를 위해 독서 색상 차이를 이론,try:

에 더 자세히 실험실에서 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 는 첨가제하고 감산 모델을 각각 모델링하는 방식은 기본 색상 빛나 안료(각각)에 결합하여 새로운 색상을 혼합하는 경우.

Graphical depiction of HSV

에서 문제가 되는 색상의 차이 목록의 수색 공간과 거리를 측정하도록 설계 동의와 인간의 지각의 색상 거리를 지원합니다.

스팸처럼 보이지만,이 링크는 정말 흥미로운 색깔을 위한 공간:)

http://www.compuphase.com/cmetric.htm

가장 쉽 거리 것 물론을 고려한 색상으로 3d 벡터에서 발생하는 동일한 원산지와 사이의 거리도 있습니다.

필요하신 경우에는 등의 요소를 고려하는 그린에서 더 유명하다 판단 강도,당신은 당신의 값이 있습니다.

ImageMagic 제공하는 다음의 것:

  • 빨간색:0.3
  • 녹색:0.6
  • 색:0.1

물론,다음과 같은 문법을 이용하여 값만 의미와 관련하여 다른 값을 다른 색깔로 뭔가 의미 있는 것은 인간에게,그래서 모두 사용할 수 있습니다 값을 것 similiarity 주문.

글로,첫 번째 포인트의 전화,나는 말의 일반적인 메트릭 HSV(색조,채도,값)또는 HSL 은 더 나은 대표자의 인간이 어떻게 인식 컬러보다는 말 RGB 또는 CYMK.보 HSL,HSV Wikipedia.

나 순진하게도 나는 플롯한 포인트에서 HSL 공간에 대한 두 개의 색상과 계산의 규모 차이를 벡터입니다.그러나 이는 밝은 노란색과 밝은 녹색으로 간주 것만큼 다른 녹색 어두운 녹색입니다.하지만 그런 많은 빨간색과 핑크 두 개의 서로 다른 색상.

또한,차이는 벡터와 동일한 방향에서 이 매개 변수는 공간이 같지 않습니다.예를 들어,인간의 눈을 선택 녹색보다 훨씬 더 다른 색상.변화에서 색조에서 그린에 의해 동일한 금액으로 교대에 붉은 보일 수 있다.도에 변화의 채도에서 작은 금액을 제의 차이점은 회색,분홍색,다른 곳에서 shift 것 사이의 차이는 두 개의 그늘이 빨간색입니다.

에서 프로그래머의 포인트 볼,당신은 것이를 그리는 데 필요 벡터 차이나 수정에 의해 비례 행렬하는 것을 조정 길이에 따라 여러 지역에서의 HSL 공간이 상당히 임의 것 기반으로 다양한 컬러의 이론 아이디어만 있을 쥐게는 상당히 임의로 하는 것에 따라 신청하고 싶어합니다.

더 나은,당신은 당신이 볼 수있는 경우에는 사람은 이미 그런 일이다.

는 사람으로 컬러 블라인드 나는 그것을 믿는 것은 좋을 더 추가하려고 하는 분리한 다음 정상적인 비전입니다.가장 일반적인 형태의 색맹은 빨강/녹색분이 포함되어 있습니다.는 것을 의미하지 않는 당신이 볼 수 없는 빨강,녹색,그것이 의미하는 것이 더 어렵다는 것을 보고 더 어려운 차이점을 확인해 보십시오.그래서 큰 분리하기 전에 컬러 블라인드는 사람의 차이를 말할 수 있다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top