Follow-up: Η εύρεση ενός ακριβούς «απόσταση» μεταξύ των χρωμάτων

ψήφοι
44

αρχική ερώτηση

Ψάχνω για μια λειτουργία που επιχειρεί να ποσοτικοποιήσει πόσο «μακρινό» (ή διακριτά) δύο χρώματα. Αυτή η ερώτηση είναι πραγματικά σε δύο μέρη:

  1. Τι χώρου χρώμα αντιπροσωπεύει καλύτερα την ανθρώπινη όραση;
  2. Τι απόσταση μετρικούς σε αυτό το χώρο αντιπροσωπεύει καλύτερα την ανθρώπινη όραση (Ευκλείδεια;)
Δημοσιεύθηκε 04/08/2008 στις 16:08
πηγή χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
43

Μετατροπή σε La * b * (γνωστός και ως απλά «Lab», και θα δείτε επίσης αναφορά σε «CIELAB»). Μια καλή γρήγορη measaure της διαφοράς χρώματος είναι

(L1-L2) ^ 2 + (Α1-Α2) ^ 2 + (b1-b2) ^ 2

επιστήμονες χρώμα έχουν και άλλες πιο εκλεπτυσμένη μέτρα, τα οποία μπορεί να μην αξίζει τον κόπο, ανάλογα με την ακρίβεια που απαιτείται για αυτό που κάνετε.

Η aκαι bαξίες αντιπροσωπεύουν αντίθετες χρώματα με έναν τρόπο παρόμοιο με το πώς λειτουργούν κώνους, και μπορεί να είναι αρνητική ή θετική. Τα ουδέτερα χρώματα - λευκό, γκρι είναι a=0, b=0. Το Lείναι φωτεινότητα ορίζεται σε ένα συγκεκριμένο τρόπο, από μηδέν (καθαρό σκοτάδι) μέχρι οτιδήποτε άλλο.

Το αργό εξήγηση: >> Με δεδομένο το χρώμα, τα μάτια μας διακρίνει ανάμεσα σε δύο ευρείες περιοχές μήκους κύματος - μπλε vs μεγαλύτερα μήκη κύματος. και, στη συνέχεια, χάρη σε μια πιο πρόσφατη γενετική μετάλλαξη, οι πλέον κώνοι μήκος κύματος διχαλωτό σε δύο, διάκριση για εμάς κόκκινο εναντίον πράσινο.

Με την ευκαιρία, θα είναι μεγάλη για την καριέρα σας να αυξηθεί πάνω από το χρώμα συναδέλφους άνθρωπος των σπηλαίων σας που ξέρουν μόνο «RGB» ή «CMYK», η οποία είναι μεγάλη για συσκευές, αλλά πιπιλίζουν για σοβαρή δουλειά αντίληψη. Έχω δουλέψει για τους επιστήμονες απεικόνισης που δεν γνωρίζουν τίποτα σχετικά με αυτά τα πράγματα!

Για περισσότερη διασκέδαση διαβάζοντας τη θεωρία διαφορά χρώματος, δοκιμάστε:

Περισσότερες λεπτομέρειες σχετικά με Lab σε http://en.kioskea.net/video/cie-lab.php3 δεν μπορώ αυτή τη στιγμή να βρει μια μη-άσχημο σελίδα που πραγματικά είχαν τους τύπους μετατροπής, αλλά είμαι σίγουρος ότι κάποιος θα επεξεργαστείτε αυτή να απαντήσει για να συμπεριλάβει ένα.

Απαντήθηκε 16/09/2008 στις 17:08
πηγή χρήστη

ψήφοι
8

όπως παραπάνω σύνδεσμο cmetric.htm απέτυχε για μένα, όπως και πολλές άλλες εφαρμογές για το χρώμα απόσταση βρήκα (μετά από πολύ καιρό jurney ..) πώς να υπολογίσει την καλύτερη απόσταση χρώμα και .. περισσότερα επιστημονικά ακριβής μία: delta Ε και από 2 (!) RGB τιμές χρησιμοποιώντας OpenCV:

Αυτό απαιτούσε 3 μετατροπές χρωματικό χώρο + κάποια μετατροπή κώδικα από javascript ( 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 );
}

Η ελπίδα αυτό βοηθά κάποιος :)

Απαντήθηκε 17/10/2013 στις 02:39
πηγή χρήστη

ψήφοι
4

HSL και HSV είναι καλύτερα για την ανθρώπινη αντίληψη των χρωμάτων. Σύμφωνα με τη Wikipedia :

Μερικές φορές είναι προτιμότερο σε συνεργασία με τα υλικά της τέχνης, ψηφιοποιημένες εικόνες ή άλλα μέσα ενημέρωσης, να χρησιμοποιούν το μοντέλο χρώματος HSV ή HSL σχέση με τα εναλλακτικά μοντέλα όπως το RGB ή CMYK, λόγω των διαφορών στον τρόπο με τα μοντέλα μιμηθούν το πώς οι άνθρωποι αντιλαμβάνονται το χρώμα. RGB και CMYK είναι προσθετικά και αφαιρετικά μοντέλα, αντίστοιχα, μοντελοποίηση τον τρόπο με τον πρωτογενή φώτα χρώμα ή χρωστικές ουσίες (αντίστοιχα) συνδυάζονται για να σχηματίσουν νέα χρώματα όταν αναμιγνύεται.

Γραφική απεικόνιση του HSV

Απαντήθηκε 04/08/2008 στις 16:16
πηγή χρήστη

ψήφοι
3

Το άρθρο της Wikipedia για το χρώμα διαφορές απαριθμεί μια σειρά από χώρους χρώμα και μετρήσεις απόστασης σχεδιαστεί για να συμφωνήσει με την ανθρώπινη αντίληψη των αποστάσεων χρώμα.

Απαντήθηκε 24/08/2008 στις 16:38
πηγή χρήστη

ψήφοι
2

Ως κάποιος που έχει αχρωματοψία πιστεύω ότι είναι καλό να προσπαθήσετε να προσθέσετε περισσότερα διαχωρισμό τότε φυσιολογική όραση. Η πιο κοινή μορφή αχρωματοψίας είναι κόκκινο / πράσινο ανεπάρκεια. Αυτό δεν σημαίνει ότι δεν μπορείτε να δείτε το κόκκινο ή πράσινο, αυτό σημαίνει ότι είναι πιο δύσκολο να δείτε και πιο δύσκολο να δούμε τις διαφορές. Γι 'αυτό χρειάζεται ένα μεγαλύτερο διαχωρισμό πριν από ένα χρώμα τυφλό άτομο μπορεί να πει τη διαφορά.

Απαντήθηκε 16/09/2008 στις 17:45
πηγή χρήστη

ψήφοι
2

Λοιπόν, ως πρώτο σημείο της κλήσης, θα έλεγα των κοινών μετρήσεων HSV (Hue, Saturation και αξία) ή HSL είναι καλύτερο εκπρόσωπο του πώς οι άνθρωποι αντιλαμβάνονται το χρώμα από ό, τι λένε RGB ή CYMK. Δείτε HSL, HSV στη Wikipedia .

Υποθέτω αφελώς θα σχεδιάσετε τα σημεία στο χώρο HSL για τα δύο χρώματα και να υπολογίσει το μέγεθος του διανύσματος διαφοράς. Ωστόσο, αυτό θα σήμαινε ότι το φωτεινό κίτρινο και έντονο πράσινο θα μπορούσε να θεωρηθεί μόνο ως διαφορετικά και πράσινο σε σκούρο πράσινο. Στη συνέχεια, όμως πολλοί θεωρούν κόκκινο και ροζ δύο διαφορετικά χρώματα.

Επιπλέον, φορείς διαφορά προς την ίδια κατεύθυνση στο χώρο αυτό η παράμετρος δεν είναι ίσες. Για παράδειγμα, το ανθρώπινο μάτι παίρνει το πράσινο πολύ καλύτερα από ό, τι άλλα χρώματα. Μια αλλαγή στο χρώμα από πράσινο κατά το ίδιο ποσό ως μετάβαση από το κόκκινο μπορεί να φαίνεται μεγαλύτερο. Επίσης, μια αλλαγή στην κορεσμού από ένα μικρό ποσό για να το μηδέν είναι η διαφορά μεταξύ γκρι και ροζ, αλλού η αλλαγή θα είναι η διαφορά μεταξύ των δύο αποχρώσεις του κόκκινου.

Από ένα σημείο προγραμματιστές άποψη, θα πρέπει να σχεδιάσετε τα διανύσματα διαφορά, αλλά τροποποιηθεί από έναν πίνακα της αναλογικότητας που θα ρυθμίσετε τα μήκη ανάλογα σε διάφορες περιοχές του χώρου HSL - αυτό θα ήταν αρκετά αυθαίρετη και θα πρέπει να βασίζεται σε διάφορες ιδέες θεωρία του χρώματος, αλλά να ρυθμιστεί αρκετά αυθαίρετα, ανάλογα με το τι θα ήθελε να εφαρμόσει αυτό.

Ακόμα καλύτερα, θα μπορούσατε να δείτε αν κάποιος έχει ήδη κάνει ένα τέτοιο πράγμα σε απευθείας σύνδεση ...

Απαντήθηκε 04/08/2008 στις 16:37
πηγή χρήστη

ψήφοι
2

Ο ευκολότερος απόσταση θα ήταν φυσικά να εξετάσει μόνο τα χρώματα και 3d φορείς που προέρχονται από την ίδια προέλευση, και λαμβάνοντας την απόσταση μεταξύ των τελικών σημείων τους.

Αν χρειαστεί να εξετάσει τα στοιχεία αυτά ότι το πράσινο είναι πιο εμφανή κατά την εκτίμηση της έντασης, μπορείτε να ζυγίσει τις τιμές.

ImageMagic παρέχει τις ακόλουθες κλίμακες:

  • κόκκινο: 0,3
  • πράσινο: 0,6
  • μπλε: 0.1

Φυσικά, οι τιμές όπως αυτό θα ήταν μόνο νόημα σε σχέση με άλλες τιμές για άλλα χρώματα, όχι σαν κάτι που θα είχε νόημα για τους ανθρώπους, έτσι το μόνο που θα μπορούσαν να χρησιμοποιήσουν τις τιμές θα είναι similiarity παραγγελία.

Απαντήθηκε 04/08/2008 στις 16:14
πηγή χρήστη

ψήφοι
2

Μπορεί να μοιάζουν με το spam, αλλά όχι, αυτή η σύνδεση είναι πραγματικά ενδιαφέρον για το χρώμα χώρους :)

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

Απαντήθηκε 04/08/2008 στις 16:14
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more