2017-06-15 28 views
7

Używam modułu opencv do odczytu i zapisu obrazu. tutaj jest kod, a poniżej obraz, który czytam, a drugi obraz po zapisaniu go na dysku przy użyciu cv2.imwrite().Kolor staje się nudny: opencv cv2.imread cv2.imwrite

import cv2 

img = cv2.imread('originalImage.jpg') 
cv2.imwrite('test.jpg',img) 

original image

image saved using opencv

Jest to wyraźnie widoczne kolory matowa w drugim obrazie. Czy istnieje jakiś obejście tego problemu lub brakuje mi jakiegoś ustawienia parametrów ..?

+0

Spróbuj zapisać w innym formacie obrazu –

+0

@RickM. czy możesz zasugerować format ...? czy powinienem spróbować PNG ..? –

+0

Prawdopodobny duplikat [Nie tracąc jakości zdjęć zapisanych przy pomocy cv2.imwrite()] (https://stackoverflow.com/questions/28940711/not-zmienianie-the-quality-of-pictures-saved-with-cv2- imwrite) –

Odpowiedz

2

Zrobiłem trochę badań na temat @mark podniesiony o profilu ICC. Znalazłem sposób radzenia sobie z tym w python modułu PIL. oto kod, który zadziałał dla mnie. Nauczyłem się również używać formatu pliku PNG, a nie JPEG, do bezstratnej konwersji.

import Image 
img = Image.open('originalImage.jpg') 
img.save('test.jpg',icc_profile=img.info.get('icc_profile')) 

Mam nadzieję, że to pomoże także innym.

+0

Dobra robota - i dziękuję za podzielenie się swoimi odkryciami ze społecznością. –

+0

Dzięki @Mark było to ze względu na twoje odkrycie, że udało mi się rozwiązać mój problem. –

3

Różnica polega na tym, że początkowy obraz (po lewej stronie wykresu) ma dołączony profil ICC, natomiast drugi (po prawej) nie.

enter image description here

I otrzymano powyższy obraz uruchamiając ImageMagick narzędzia zwanego identify tak:

identify -verbose first.jpg > 1.txt 
identify -verbose second.jpg > 2.txt 

Następnie uruchomiono błyszczącą opendiff narzędzia (który jest częścią Macos), jak to:

opendiff [12].txt 

Można wyodrębnić profil ICC z pierwszego obrazu także ImageMagick tak:

convert first.jpg profile.icc 
+0

Jak więc dbać o ten profil ICC podczas pisania obrazu przez opencv ..? –

+0

Niezły chwyt! To jednak nie rozwiązuje problemu OP! –

+1

Witam @AnderBiguri Tak, zgadzam się, aby nie * rozwiązać * problemu, ale uważam, że odpowiedzi, które pomagają zrozumieć, jaki jest problem, są całkowicie akceptowalne i jeśli dwoje ludzi zna połowę odpowiedzi ... cóż, możemy być w stanie wypracować między nami pełną odpowiedź. Na razie chcę powiedzieć, że uważam, że ** OpenCV ** jest bardziej nastawiony na rozwiązywanie "problemów z komputerem" i jest mniej przekręcany w kierunku martwienia się o wierność zarządzania kolorem w celach drukowania i reprodukcji, więc podejrzewam, że OP będzie potrzebował aby wziąć pod uwagę profil ICC. Mogę się mylić :-) –

0

Twoje pierwsze wejście obraz ma jakąś ICC-Profil zrzeszonych w meta-danych, który jest atrybutem opcjonalnym i najbardziej urządzenia nie mogą wstrzykiwać go w pierwszej kolejności. Profil ICC zasadniczo wykonuje rodzaj korekcji kolorów, a współczynniki korygujące są obliczane dla każdego unikalnego urządzenia podczas kalibracji.

Współczesne przeglądarki internetowe, narzędzia do przeglądania obrazu biorą pod uwagę informacje o profilu ICC przed renderowaniem obrazu na ekranie, dlatego w obu obrazach występuje różnica.

Ale Niestety OpenCV nie odczytuje konfiguracji ICC z danych meta obrazu, aby wykonać dowolną korekcję kolorów.

+0

czy masz pojęcie o jakimkolwiek narzędziu, które zajmuje się profilem ICC ..? W dowolnym języku i dowolnej strukturze.? –

+0

Nie sądzę, że istnieje jakaś biblioteka, która obsługuje czytanie obrazu z meta-danymi, ale możesz spojrzeć na to [link] (https://imageoptim.com/color-profiles.html), aby uzyskać obrazy w profilu sRGB niż ICC. – ZdaR