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.
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.
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
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.
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.
Ten czerwono-musztardowo-zielony jest brzydki, ale interpolacja wydaje się rozsądna.
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.
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.
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.
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ś
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