Chcę zaprojektować program, który pomoże mi ocenić pomiędzy 5 predefiniowanymi kolorami, który jest bardziej podobny do koloru zmiennego iz jakim procentem. Chodzi o to, że nie wiem, jak to zrobić ręcznie, krok po kroku. Dlatego jeszcze trudniej jest wymyślić program.
Więcej szczegółów: Kolory pochodzą z fotografii tub z żelem o różnych kolorach. Mam 5 rurek w różnych kolorach, z których każda jest reprezentatywna dla 1 z 5 poziomów. Chcę zrobić zdjęcia innych próbek i ocenić na komputerze, do jakiego poziomu należy ta próbka, porównując kolory, i chcę to wiedzieć również z procentem przybliżenia. Chciałbym program, który robi coś takiego: http://www.colortools.net/color_matcher.html
Jeśli możesz mi powiedzieć, jakie kroki mam podjąć, nawet jeśli są to rzeczy do przemyślenia i wykonania ręcznie. Byłoby to bardzo pomocne.
Odpowiedzi:
Zapoznaj się z artykułem Wikipedii na temat różnicy kolorów, aby uzyskać informacje na temat odpowiednich potencjalnych klientów. Zasadniczo chcesz obliczyć metrykę odległości w jakiejś wielowymiarowej przestrzeni kolorów. Ale RGB nie jest „percepcyjnie jednolity”, więc metryka odległości Euclidean RGB sugerowana przez Vadima nie będzie pasować do odległości między kolorami postrzeganej przez człowieka. Po pierwsze, L a b * ma być percepcyjnie jednolitą przestrzenią kolorów, a metryka deltaE jest powszechnie stosowana. Ale są bardziej wyrafinowane przestrzenie kolorów i bardziej wyrafinowane formuły deltaE, które zbliżają się do ludzkiej percepcji.
Będziesz musiał dowiedzieć się więcej o przestrzeniach kolorów i oświetlaczach, aby dokonać konwersji. Ale dla szybkiej formuły, która jest lepsza niż metryka Euklidesa RGB, zrób to: załóżmy, że twoje wartości RGB znajdują się w przestrzeni kolorów sRGB, znajdź formuły konwersji sRGB na L a b *, przekonwertuj kolory sRGB na L a b *, i oblicz deltaE między dwiema wartościami L a b *. Nie jest to kosztowne obliczeniowo, to tylko niektóre nieliniowe formuły i niektóre mnożenia i dodania.
źródło
color
klejnot, który implementuje deltaE wśród innych operacji koloru.Pomysł, który jako pierwszy przyszedł mi do głowy (przepraszam, jeśli jest głupi). Można założyć trzy składowe kolorów współrzędnych punktów, a następnie obliczyć odległość między punktami.
FE
Odległość między kolorami wynosi
Procent to
źródło
właściwie szedłem tą samą ścieżką kilka miesięcy temu. nie ma idealnej odpowiedzi na pytanie (które zostało tu zadane kilka razy), ale jest jedna bardziej wyrafinowana odpowiedź niż sqrt (rr) itp. i łatwiejsza do zaimplementowania bezpośrednio za pomocą RGB bez przechodzenia do wszelkiego rodzaju alternatywnych przestrzeni kolorów. Znalazłem tutaj tę formułę , która jest niedrogim przybliżeniem dość skomplikowanej rzeczywistej formuły (przez CIE, która jest W3C koloru, ponieważ jest to niedokończona misja, można tam znaleźć starsze i prostsze równania różnicy kolorów). powodzenia
Edycja: dla potomnych, oto odpowiedni kod C:
źródło
Wartość koloru ma więcej niż jeden wymiar, więc nie ma wewnętrznego sposobu na porównanie dwóch kolorów. Musisz określić dla swojego przypadku użycia znaczenie kolorów, a tym samym jak najlepiej je porównać.
Najprawdopodobniej będziesz chciał porównać właściwości barwy, nasycenia i / lub jasności kolorów w przeciwieństwie do składników czerwonego / zielonego / niebieskiego. Jeśli masz problem ze znalezieniem sposobu, w jaki chcesz je porównać, weź kilka próbek kolorów i porównaj je w myślach, a następnie spróbuj uzasadnić / wyjaśnić sobie, dlaczego są podobne / różne.
Kiedy już wiesz, jakie właściwości / składniki kolorów chcesz porównać, musisz dowiedzieć się, jak wydobyć te informacje z koloru.
Najprawdopodobniej wystarczy przekonwertować kolor ze zwykłej reprezentacji RedGreenBlue na HueSaturationLightness, a następnie obliczyć coś w rodzaju
Ten przykład poda prostą wartość skalarną wskazującą, jak daleko od siebie znajdują się gradienty / odcień kolorów.
Zobacz HSL i HSV w Wikipedii .
źródło
Jeśli masz dwa
Color
obiektyc1
ic2
można tylko porównać z każdą wartość RGBc1
ze skutecznościąc2
.Te wartości możesz po prostu podzielić przez ilość nasycenia różnicowego (255), a otrzymasz różnicę między nimi.
Po czym możesz po prostu znaleźć średnią różnicę kolorów w procentach.
Co dałoby różnicę w procentach między
c1
ac2
.źródło
pctDiffRed = diffRed / 255;
da ci 0, chyba że rzucisz gdzieś na pływak. <b> 2 </b> Musisz pomnożyć gdzieś przez 100, aby uzyskać procent.Jedną z najlepszych metod porównywania dwóch kolorów na podstawie ludzkiej percepcji jest CIE76. Różnica nazywa się Delta-E. Kiedy jest mniejsza niż 1, ludzkie oko nie może rozpoznać różnicy.
Istnieje wspaniała klasa narzędzi koloru ColorUtils (kod poniżej), która zawiera metody porównawcze CIE76. Napisał go Daniel Strebel z Uniwersytetu w Zurychu.
Z ColorUtils.class korzystam z metody:
r1, g1, b1 - wartości RGB pierwszego koloru
r2, g2, b2 - wartości RGB drugiego koloru, który chcesz porównać
Jeśli pracujesz z Androidem, możesz uzyskać następujące wartości:
r1 = Color.red(pixel);
g1 = Color.green(pixel);
b1 = Color.blue(pixel);
ColorUtils.class, Daniel Strebel, Uniwersytet w Zurychu:
źródło
Jeszcze inna odpowiedź, choć podobna do tej Supr - po prostu inna przestrzeń kolorów.
Rzecz w tym, że ludzie postrzegają różnicę kolorów niejednolicie, a przestrzeń kolorów RGB to ignoruje. W rezultacie, jeśli użyjesz przestrzeni kolorów RGB i po prostu obliczysz odległość euklidesową między 2 kolorami, możesz otrzymać różnicę, która jest matematycznie absolutnie poprawna, ale nie pokrywa się z tym, co powiedzą ci ludzie.
To może nie być problemem - myślę, że różnica nie jest aż tak duża, ale jeśli chcesz rozwiązać ten „lepiej”, powinieneś przekonwertować kolory RGB na przestrzeń kolorów, która została specjalnie zaprojektowana, aby uniknąć powyższego problemu. Jest kilka z nich, ulepszeń z wcześniejszych modeli (ponieważ jest to oparte na ludzkiej percepcji, musimy zmierzyć „prawidłowe” wartości na podstawie danych eksperymentalnych). Jest przestrzeń kolorów Lab, która moim zdaniem byłaby najlepsza, chociaż trochę skomplikowana do konwersji. Prostszy byłby CIE XYZ .
Oto witryna zawierająca formuły do konwersji między różnymi przestrzeniami kolorów , abyś mógł trochę poeksperymentować.
źródło
Wszystkie poniższe metody dają wynik w skali od 0-100.
źródło
Najlepszym sposobem jest deltaE. DeltaE to liczba pokazująca różnicę kolorów. Jeśli deltae <1, to różnicy nie można rozpoznać ludzkimi oczami. Napisałem kod w kanwie i js do konwersji rgb na lab, a następnie obliczenia delta e. W tym przykładzie kod rozpoznaje piksele, które mają inny kolor, z kolorem podstawowym, który zapisałem jako LAB1. a jeśli jest inny, sprawia, że piksele są czerwone. Możesz zwiększyć lub zmniejszyć czułość różnicy kolorów, zwiększając lub zmniejszając dopuszczalny zakres delta e. W tym przykładzie przypisałem 10 dla deltaE w linii, którą napisałem (deltae <= 10):
}
// ------------------------------------------------ -------------------------------------------------- ---
źródło
1/3
i16/116
oba oceniają0
, co prawie na pewno nie jest tym, czego chcesz. Prawdopodobnie twój algorytm jest poprawny, ale twój kod z pewnością nie.Prostą metodą, która używa tylko RGB, jest
Używam tego od jakiegoś czasu i działa wystarczająco dobrze w większości zastosowań.
źródło
1/3
Użyłem tego w moim Androidzie i wydaje się satysfakcjonujące, chociaż przestrzeń RGB nie jest zalecana:
Następnie użyłem poniższego, aby uzyskać procent podobieństwa:
Działa wystarczająco dobrze.
źródło
Wypróbowałem różne metody, takie jak przestrzeń kolorów LAB, porównania HSV i odkryłem, że jasność działa całkiem dobrze w tym celu.
Oto wersja Pythona
Da tobie
źródło
ImageColor
? edytuj Znalazłem, to jestfrom PIL import ImageColor
Spodziewam się, że na końcu zechcesz przeanalizować cały obraz, prawda? Możesz więc sprawdzić najmniejszą / najwyższą różnicę w matrycy kolorów tożsamości.
Większość operacji matematycznych do przetwarzania grafiki wykorzystuje macierze, ponieważ możliwe algorytmy, które ich używają, są często szybsze niż klasyczne obliczenia punkt po punkcie, odległość i porównanie. (np. dla operacji wykorzystujących DirectX, OpenGL, ...)
Więc myślę, że powinieneś zacząć tutaj:
http://en.wikipedia.org/wiki/Identity_matrix
http://en.wikipedia.org/wiki/Matrix_difference_equation
... i jak skomentował już Beska powyżej:
Co oznacza również, że twój algorytm zależy od twojej definicji "podobnego do", jeśli przetwarzasz obrazy.
źródło
Wersja Kotlin, z jakim procentem chcesz dopasować.
Wywołanie metody z opcjonalnym argumentem procentowym
Treść metody
źródło
Będziesz musiał przekonwertować wszystkie kolory RGB na przestrzeń kolorów Lab, aby móc je porównać tak, jak widzą je ludzie. W przeciwnym razie kolory RGB będą się „pasować” w bardzo dziwny sposób.
Łącze do Wikipedii na temat Różnice kolorów zawiera wprowadzenie do różnych algorytmów różnic w przestrzeni kolorów w Laboratorium, które zostały zdefiniowane przez lata. Najprostszy, który sprawdza tylko odległość euklidesową dwóch kolorów laboratoryjnych, działa, ale ma kilka wad.
Dogodnie istnieje implementacja bardziej wyrafinowanego algorytmu CIEDE2000 w projekcie OpenIMAJ w języku Java . Podaj mu swoje dwa zestawy kolorów Lab, a otrzymasz pojedynczą wartość odległości.
źródło
Jedynym „właściwym” sposobem porównania kolorów jest zrobienie tego z deltaE w CIELab lub CIELuv.
Ale w przypadku wielu aplikacji myślę, że jest to wystarczająco dobre przybliżenie:
distance = 3 * |dR| + 4 * |dG| + 3 * |dB|
Myślę, że ważona odległość do Manhattanu ma dużo większy sens przy porównywaniu kolorów. Pamiętaj, że kolory podstawowe są tylko w naszej głowie. Nie mają żadnego fizycznego znaczenia. CIELab i CIELuv są modelowane statystycznie na podstawie naszego postrzegania koloru.
źródło
Na szybkie i brudne możesz to zrobić
wykorzystanie dzielenia liczb całkowitych do kwantyzacji kolorów.
źródło
Szybka odpowiedź 5
Znalazłem ten wątek, ponieważ potrzebowałem szybkiej wersji tego pytania. Ponieważ nikt nie odpowiedział na rozwiązanie, oto moje:
Stosowanie:
Ustawiłem mniej niż 10% różnicy, aby zwrócić podobne kolory, ale możesz to dostosować samodzielnie.
źródło
Android dla ColorUtils API RGBToHSL: Miałem dwa kolory int argb ( color1, color2 ) i chciałem uzyskać odległość / różnicę między tymi dwoma kolorami. Oto, co zrobiłem;
Następnie użyłem poniższego kodu, aby znaleźć odległość między dwoma kolorami.
źródło