سؤال

السؤال الأصلي

أنا أبحث عن وظيفة محاولات لقياس مدى "البعيدة" (أو متميزة) اثنين من الألوان.هذا السؤال هو حقا في قسمين:

  1. ما لون الفضاء يمثل أفضل الإنسان الرؤية ؟
  2. ما المسافة متري في هذا الفضاء يمثل أفضل رؤية الإنسان (الإقليدية?)
هل كانت مفيدة؟

المحلول

تحويل إلى La*ب* (الملقب عادي فقط "المختبر" و سترى أيضا الإشارة إلى "CIELAB").جيد سريعة measaure من اختلاف اللون هو

(L1-L2)^2 + (a1-a2)^2 + (b1-b2)^2

اللون العلماء أخرى أكثر دقة التدابير التي قد لا يكون يستحق كل هذا العناء ، اعتمادا على دقة حاجة ما تفعله.

على a و b القيم تمثل معارضة الألوان بطريقة مماثلة إلى كيف المخاريط العمل ، و قد تكون سلبية أو إيجابية.الألوان المحايدة - الأبيض الرمادي هي a=0,b=0.على L هو سطوع يعرف بطريقة معينة ، من الصفر (نقية الظلام) تصل إلى ما.

الخام التفسير :>> إعطاء لون أعيننا نميز بين اثنين من نطاقات واسعة من الطول الموجي الأزرق مقابل أطوال موجية أطول.ثم بفضل أحدث طفرة جينية, أطول طول موجي المخاريط انقسم إلى قسمين ، مع التمييز لنا الحمراء مقابلالأخضر.

بالمناسبة ستكون كبيرة على حياتك المهنية إلى الارتفاع فوق اللون الكهف وزملائك الذين يعرفون فقط "RGB" أو "CMYK" والتي هي كبيرة لأجهزة ولكن تمتص خطيرة تصور العمل.لقد عملت من أجل التصوير العلماء الذين لا يعرفون شيئا عن هذه الأشياء!

لمزيد من متعة القراءة على اختلاف اللون نظرية المحاولة:

مزيد من التفاصيل على مختبر في http://en.kioskea.net/video/cie-lab.php3 لا أستطيع في هذا الوقت تجد غير قبيحة الصفحة التي كان الواقع تحويل الصيغ ولكن أنا متأكد من شخص ما سوف تحرير هذا الجواب أن تشمل واحدة.

نصائح أخرى

كما cmetric.htm الرابط أعلاه فشل بالنسبة لي, فضلا عن العديد من التطبيقات الأخرى اللون المسافة وجدت (بعد فترة طويلة جدا jurney..) كيفية حساب أفضل لون بعد ..معظم علميا دقيقة واحدة: deltaE و من 2 RGB (!) القيم باستخدام بنسف:

هذا مطلوب 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 );
}

آمل أن يساعد شخص ما :)

الأعرج و HSV أفضل الإنسان إدراك اللون.وفقا ويكيبيديا:

فمن الأفضل في بعض الأحيان في العمل مع المواد الفنية ، الصور الرقمية ، أو وسائل الإعلام الأخرى ، استخدام HSV أو الأعرج لون نموذج على نماذج بديلة مثل RGB أو CMYK, بسبب الاختلافات في طرق نماذج محاكاة كيف البشر إدراك اللون.RGB و CMYK هي مضافة و مطروح النماذج ، على التوالي ، النمذجة الطريقة التي الأولية أضواء ملونة أو أصباغ (على التوالي) الجمع بين لتشكيل الألوان الجديدة عندما مختلطة.

Graphical depiction of HSV

على مقالة ويكيبيديا على لون الاختلافات عددا من مساحات اللون و المسافة مقاييس تهدف إلى توافق مع الإنسان إدراك اللون المسافات.

قد تبدو وكأنها غير مرغوب فيها ولكن لا, هذا الرابط هو حقا مثيرة للاهتمام بالنسبة مساحات الألوان :)

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

أسهل المسافة بطبيعة الحال سيكون مجرد النظر في الألوان 3d المتجهات منشؤها من نفس المنشأ ، وأخذ المسافة بين نقطة النهاية.

إذا كنت بحاجة إلى النظر في هذه العوامل أن الأخضر هو أكثر بروزا في الحكم كثافة ، يمكنك أن تزن القيم.

ImageMagic يوفر المقاييس التالية:

  • الأحمر:0.3
  • الأخضر:0.6
  • الأزرق:0.1

بالطبع قيم مثل هذا لن يكون ذا معنى إلا بالنسبة إلى غيرها من قيم الألوان الأخرى ، لا شيء من شأنها أن تكون مفيدة للبشر ، يمكن استخدام قيم سيكون similiarity الطلب.

إن النقطة الأولى من المكالمة, أقول المشتركة المقاييس HSV (هوى والتشبع و القيمة) أو الأعرج أفضل ممثل كيف البشر إدراك اللون من القول RGB أو CYMK.انظر الأعرج ، HSV على ويكيبيديا.

أعتقد بسذاجة أود أن المؤامرة النقاط في الأعرج مساحة اثنين من الألوان وحساب حجم الفرق ناقلات.ومع ذلك فإن هذا يعني أن مشرق الأصفر والأخضر الساطع تعتبر فقط مختلفة مثل الأخضر إلى اللون الأخضر الداكن.ولكن بعد النظر في كثير من الأحمر والوردي اثنين من ألوان مختلفة.

وعلاوة على ذلك, الفرق ناقلات في نفس الاتجاه في هذه المعلمة مساحة غير متساوية.فعلى سبيل المثال ، فإن العين البشرية تلتقط الأخضر أفضل بكثير من الألوان الأخرى.التحول في هوى من الأخضر بنفس مقدار التحول من اللون الأحمر قد يبدو أكبر.أيضا تحولا في التشبع من كمية صغيرة إلى الصفر هو الفرق بين الرمادي و الوردي ، في أماكن أخرى التحول سيكون الفرق بين اثنين من ظلال من اللون الأحمر.

من المبرمجين وجهة نظر, سوف تحتاج إلى مؤامرة الفرق ناقلات ولكن تعديل بواسطة التناسب المصفوفة التي من شأنها ضبط أطوال وفقا لذلك في مختلف مناطق الأعرج الفضاء سيكون هذا إجراء تعسفي إلى حد ما ، على أساس لون مختلف نظرية الأفكار ولكن أنب بشكل تعسفي إلى حد ما اعتمادا على ما أردت تطبيق هذا.

حتى أفضل, هل يمكن أن نرى إذا كان أي شخص لديه بالفعل شيء من هذا القبيل على الانترنت...

كمن هو أعمى اللون وأعتقد أنه أمر جيد في محاولة لإضافة المزيد من الانفصال ثم الرؤية العادية.الشكل الأكثر شيوعا من عمى الألوان أحمر/أخضر نقص.هذا لا يعني أنه لا يمكنك رؤية أحمر أو أخضر ، فهذا يعني أنه من الصعب أن نرى المزيد من الصعب أن نرى الاختلافات.لذلك يأخذ أكبر الانفصال قبل بعمى الألوان يمكن للشخص معرفة الفرق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top