Utánkövetést: Finding egy pontos „távolság” a színek között

szavazat
44

eredeti kérdés

I am looking for egy függvény, amely megpróbálja számszerűsíteni „távoli” (vagy különböző) két szín. Ez a kérdés valóban két részből áll:

  1. Mi színtér a legjobban képviseli az emberi látás?
  2. Mi távolság mértéket, hogy a tér a legjobban képviseli az emberi látás (euklideszi?)
A kérdést 04/08/2008 16:08
a forrás felhasználó
Más nyelveken...                            


8 válasz

szavazat
43

Átalakítás La * b * (aka csak sima „Lab”, és akkor is látni hivatkozás „CIELAB”). Egy jó gyors measaure a szín különbség

(L1-L2) ^ 2 + (a1-a2) ^ 2 + (B1-B2) ^ 2

Színes tudósok más kifinomultabb intézkedéseket, amelyek lehetnek nem éri meg a fáradságot, attól függően, hogy a pontosság szükséges, hogy mit csinálsz.

A aés bértékeket képviselnek ellentétes színek hasonló módon, hogyan működik kúpok, és lehet negatív vagy pozitív. Semleges színek - fehér, szürke árnyalatok a=0, b=0. A Ljelentése fényerő meghatározott különleges módon, a nulla (tiszta sötétség) akár bármi.

Nyers magyarázat: >> Adott egy szín, a szemünk megkülönböztetni két széles tartományai hullámhossz - kék vs hosszabb hullámhosszak felé. majd, köszönhetően egy újabb genetikai mutáció, a hosszabb hullámhosszú kúp szárú két, megkülönböztetve számunkra piros vs. zöld.

By the way, nagyszerű lesz a karrierje fölé emelkedik a színes ősember munkatársait, akik tudják, csak az „RGB” vagy „CMYK”, amelyek nagy részére eszközök, hanem szopni komoly észlelés munkát. Már dolgoztam képalkotó tudósok, akik nem tudják a dolog ez a cucc!

További szórakoztató olvasás színkülönbség elmélet próbálja:

További részleteket Lab http://en.kioskea.net/video/cie-lab.php3 nem tudok ebben az időben találni, nem csúnya oldalt, hogy valóban volt az átszámítási képlet, de biztos vagyok benne, hogy valaki szerkeszteni ezt válaszolni, hogy az egyetlenegy.

Válaszolt 16/09/2008 17:08
a forrás felhasználó

szavazat
8

mint cmetric.htm fenti link nem értem, valamint számos más megvalósítások színenként távolság találtam (miután egy nagyon hosszú jurney ..), hogyan kell kiszámítani a legjobb szín a távolság, és .. legtudományosabban pontosabb: deltaE és 2 RGB (!) értékeket OpenCV:

Ez a szükséges 3 színtér konverziók + néhány kódot konverzió javascript ( http://svn.int64.org/viewvc/int64/colors/colors.js ) a C ++

És végül a kód (úgy tűnik, működik, jobb kívül a doboz, remélem senki nem találja egy súlyos hibát ott ... de úgy tűnik, rendben miután számos teszt)

#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 );
}

Remélem ez segít valaki :)

Válaszolt 17/10/2013 02:39
a forrás felhasználó

szavazat
4

HSL és HSV jobbak az emberi színérzékelést. Szerint a Wikipedia :

Néha előnyös dolgozó művészeti anyagok, digitalizált képek vagy más média, hogy használja a HSV vagy HSL szín modellt alternatív modellek, mint az RGB vagy CMYK, mivel a különbségek a szempontból a modell versenyez az emberek hogyan érzékelik a színeket. RGB és CMYK additív és szubtraktív modell, illetve modellezése az is, hogy az elsődleges szín világít vagy pigmentek (sorrendben) együttesen alkotják az új színek összekeverve.

Grafikus ábrázolása, HSV

Válaszolt 04/08/2008 16:16
a forrás felhasználó

szavazat
3

A Wikipedia article színeltérések felsorol számos színes terek és a távolság mutatók célja, hogy egyetértenek az emberi színérzékelésünket távolságok.

Válaszolt 24/08/2008 16:38
a forrás felhasználó

szavazat
2

Mint aki színvak Úgy vélem, jó, hogy megpróbálja felvenni több elválasztási, akkor normális látás. A leggyakoribb formája a színvakság piros / zöld hiány. Ez nem azt jelenti, hogy nem lehet látni piros vagy zöld, az azt jelenti, hogy nehezebb látni és nehezebb látni a különbséget. Tehát vesz egy nagyobb elválasztás előtt színtévesztő személy, mi a különbség.

Válaszolt 16/09/2008 17:45
a forrás felhasználó

szavazat
2

Nos, mint az első pont a hívást, azt mondanám, hogy a közös mutatókat HSV (árnyalat, a telítettség és az érték), vagy HSL jobban képviselője az emberek hogyan érzékelik a színeket, mint mondjuk RGB vagy CYMK. Lásd HSL, HSV a Wikipédián .

Gondolom naivan azt ábrázolja a pontokat a HSL helyet a két szín, és kiszámítja a különbség nagysága alapján vektor. Azonban ez azt jelentené, hogy világos sárga és élénk zöld lenne tekinthető, csak más, mint sötétzöldig. De aztán sokan úgy vélik, piros és rózsaszín, két különböző színben.

Továbbá, különbség vektorok az ugyanabban az irányban ez a paraméter térben nem egyenlő. Például az emberi szem felveszi zöld sokkal jobb, mint más színek. A váltás színe a zöld az ugyanannyi, mint az eltolódást a vörös tűnhet nagyobb. Szintén eltolódást telítettség, a kis mennyiségű nullára a különbség szürke és rózsaszín, máshol a váltás lenne a különbség a két árnyalatú piros.

Egy programozó szemszögéből, akkor lenne szükség, hogy a telek különbség vektorok de módosított arányossági mátrix, ami módosíthatja a hosszát ennek megfelelően különböző régióiban a HSL tér - ez lenne elég önkényes, és alapul különböző színelmélet ötletek, de csípett meglehetősen önkényesen attól függően, mit akart ez alkalmazható.

Még jobb, ha lehetne látni, ha valaki már ilyet online ...

Válaszolt 04/08/2008 16:37
a forrás felhasználó

szavazat
2

A legegyszerűbb távolság lenne természetesen, hogy csak úgy a színeket, mint a 3d vektorok származó azonos eredetű, és az a távolság között ezek végpontjai.

Ha meg kell vennie az olyan tényezőket, hogy a zöld még szembetűnőbb megítélésében intenzitás, akkor mérlegelni az értékeket.

ImageMagic az alábbi skálák:

  • vörös: 0,3
  • zöld: 0,6
  • kék: 0,1

Természetesen olyan értékek, mint ez csak akkor lenne értelme, illetve a többi értékeket más színű, nem pedig azért, hogy lenne értelme az emberek, így minden jól jönne az értékeket lenne similiarity rendelés.

Válaszolt 04/08/2008 16:14
a forrás felhasználó

szavazat
2

Tűnhet, mint a spam, de nem, ez a kapcsolat valóban érdekes színterek :)

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

Válaszolt 04/08/2008 16:14
a forrás felhasználó

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