Jaki jest najlepszy sposób na uśrednianie dwóch kolorów, które definiują gradient liniowy?

Jeśli mam dwa kolory zdefiniowane przez ich wartości RGB, Czy Mogę uśrednić wartości Czerwony, zielony i niebieski, a następnie połączyć, aby zdefiniować trzeci kolor, który wygląda jak średnia wizualna z tych dwóch?

Ie NewColor = (R1+R2)/2,(G1+G2)/2,(B1+B2)/2

EDIT1: dzięki za wszystkie odpowiedzi. Na moje obecne potrzeby mam do czynienia tylko z parami kolorów, które są odcieniami tego samego koloru, więc myślę, że uśrednianie ich zadziała. Jednak spróbuję przekonwertować do przestrzeni laboratoryjnej, aby upewnić się, że założenie jest prawdziwe i technika będzie przydatna w przyszłości.

EDIT2: oto moje wyniki FWIW. Color1 i Color2 to moje dwa kolory, a dwie środkowe kolumny to wyniki uśredniania odpowiednio w przestrzeni L a b i uśredniania RGB. W tym przypadku nie ma dużej różnicy między dwoma kolorami, a więc różnice w wyjściu z technik uśredniania są subtelne.

wizualne porównanie technik uśredniania kolorów

 38
Author: Ilmari Karonen, 2009-03-16

8 answers

Spójrz na odpowiedzi na to pytanie .

Zasadniczo, chcesz przekonwertować kolory na coś o nazwie Lab space i znaleźć ich średnią w tej przestrzeni.

Przestrzeń laboratoryjna jest sposobem przedstawiania kolorów, w których punkty, które są blisko siebie, są tymi, które wyglądają podobnie do siebie dla ludzi.

 20
Author: Blorgbeard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:53

Kilka odpowiedzi sugeruje konwersję na laboratoryjną przestrzeń kolorów - co jest prawdopodobnie dobrym podejściem do bardziej skomplikowanej manipulacji kolorami.

Ale jeśli po prostu potrzebujesz szybkiego sposobu na pobranie średniej dwóch kolorów, można to zrobić w przestrzeni RGB. Musisz tylko mieć na uwadze zastrzeżenie: musisz skorygować wartości RGB przed uśrednieniem ich, a następnie wziąć źródło wyniku. (Jeśli po prostu weźmiesz średnią, wynik będzie zbyt ciemny.)

Tak:

NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)

Oto świetny vid, który wyjaśnia, dlaczego ta metoda jest skuteczna: https://www.youtube.com/watch?v=LKnqECcg6Gw

 22
Author: arntjw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-11 10:21:15

Uśrednianie w przestrzeni kolorów HSL może przynieść lepsze wyniki.

 6
Author: eugensk00,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 07:13:08

Nie wiem, czy przyjmowanie prostej średniej składników jest "najlepsze" z percepcyjnego punktu widzenia (brzmi to jak pytanie dla psychologa), ale oto kilka przykładów z wykorzystaniem prostej uśredniania składników.

alt text

Ten czerwono-musztardowo-zielony jest brzydki, ale interpolacja wydaje się rozsądna.

 6
Author: Willie Wheeler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-19 20:58:32

Tak. Można przeciąć dwa kolory razem w ten sposób. Jest to podejście używane przez OpenGL do mieszania kolorów ze sobą (np. w tworzeniu map mip do renderowania odległych obiektów lub renderowania przezroczystej tekstury w 50%). Jest szybki, prosty i "wystarczająco dobry" w wielu sytuacjach. Nie jest jednak do końca realistyczny i prawdopodobnie nie byłby używany na zdjęciach o jakości fotograficznej.

 4
Author: Cybis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 08:08:09

To jest trudne. Po pierwsze, zestaw wartości RGB nie definiuje koloru. Muszą być interpretowane w świetle podstawowych kolorów, do których się odnoszą( przestrzeni kolorów), takich jak sRGB, Rec.709, Rec.2020, Adobe RGB (1998) itp.

Co więcej, wartości RGB, z którymi zwykle się spotykamy, nie są proporcjonalne do światła liniowego: są "kodowane" za pomocą funkcji nieliniowej (gamma). A czasami (głównie w aplikacjach wideo) wartość "czerni" nie jest równa zeru, ale jest przesunięta od zera, Zwykle 16 dla wartości 8-bitowych. A "biały" to nie 255, ale 235. sRGB i Rec.709 współdzielą podstawowe RGB, ale ich funkcje gamma są inne.

Konwersja przestrzeni kolorów rozpoczyna się od usunięcia przesunięcia czerni, tak aby czerń była równa zeru. Jeśli funkcja gamma ma w sobie punkt przerwania (jak sRGB i Rec.709 do), musisz starannie przeskalować wartości RGB tak, aby "Biały" wynosił 1,0.

Następnie" dekoduj " gamma wykonując odwrotność pierwotnej funkcji gamma. (Jedna odpowiedź sugerowała wartości, co jest przybliżeniem dekodowania gamma.) Teraz masz liniowe wartości RGB światła w pewnej przestrzeni kolorów. W tym momencie możesz konwertować z tej przestrzeni kolorów do przestrzeni laboratoryjnej. Większość konwersji z RGB do Lab przechodzi przez pośrednią przestrzeń kolorów o nazwie XYZ.

Kroki wywołane przez zagnieżdżoną funkcję:

Lab = XYZ2Lab( RGB2XYZ( gamma_decode( offset_and_scale (RGB), gammaFunction ), przestrzeń kolorów RGB ) )

(przestrzeń laboratoryjna została opracowana w 1976 roku jako próba stworzenia percepcyjnie jednolitego wypaczenia standardowej przestrzeni Cie XYZ. (Luv był kolejną próbą.) Chodzi o to, że euklidesowa (prosta) odległość między dwoma kolorami, które były po prostu-zauważalnie Różne (1 "JND") byłaby taka sama odległość dla dowolnych dwóch kolorów. Odległość między dwoma kolorami w laboratorium jest znana jako "delta-E". Prosty wzór delty euklidesowej nazywa się teraz dE76. Zobacz https://en.wikipedia.org/wiki/Color_difference )

W Twoim przypadku, ty może uśrednić dwa kolory laboratoryjne, aby uzyskać nowy Kolor laboratoryjny, a następnie odwrócić wszystkie konwersje, aby powrócić do RGB w wybranej przestrzeni kolorów.

To zbliży cię do siebie, ale nie jest to gwarantowane, po prostu dlatego, że "kolor" jest ludzkim postrzeganiem, a nie fizyczną ilością i jest notorycznie trudny do wiarygodnego scharakteryzowania. Laboratorium nie pracowało zbyt dobrze, by być postrzegalnie jednolitym. Zamiast więc naprawić Laboratorium, zaproponowali nową, bardziej złożoną funkcję delta-E z inną wbudowaną warp: DE94 To było lepsze, ale nie doskonałe, więc kolejna propozycja pojawiła się w 2000: DE2000. Również lepsze, ale nie idealne. Zobacz tę stronę Wiki powyżej, aby uzyskać więcej informacji.

Jeśli DE2000 nie jest wystarczająco dobry (lub zbyt złożony!) możesz spojrzeć na alternatywę dla laboratorium o nazwie ICtCp , która twierdzi, że jest bardziej jednolita percepcyjnie niż Laboratorium.

 1
Author: user1539094,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 20:24:12

Myślę, że odpowiedź arntjw idzie we właściwym kierunku i rozpoznaje podkład logarytmiczny, jak wspomniał Dan W. jednak właściwą średnią geometryczną nie jest sqrt ((C1^2+C2^2)/2), ale sqrt(C1*C2). Więc średni kolor będzie:

NewColor = sqrt(R1*R2),sqrt(G1*G2),sqrt(B1*B2)

Uzyskane kolory są bliższe temu, czego oczekujemy. Można generalizować do większej liczby kolorów za pomocą pierwiastków wyższego rzędu i ważyć każdy kolor, dodając wykładnik do jego składników.

 1
Author: lenov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 15:43:18

Jest o wiele prostszy sposób.

  • Skaluj obraz do 1px przez 1px.

    Kolor 1px to średni kolor tego co przeskalowałeś

 -2
Author: jellohead,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-14 14:08:31