W ramach tego materiału będziemy będziemy zajmować się poznawaniem innych rozwiązań i zagadnień związanych z pracą z obrazem w środowisku Python. Będziemy operować na poniższym zestawie bibliotek:
NumPy
– biblioteka wspierająca operacje na tablicach i macierzach https://pypi.org/project/numpy/ https://numpy.org/Pillow
– biblioteka wspierająca otwieranie, przetwarzanie i zapis różnych formatów plików. Jest odgałęzieniem PIL (Python Imaging Library, PIL fork) i na niej bazuje https://pypi.org/project/Pillow/ https://python-pillow.org/Matplotlib
– biblioteka umożliwiająca tworzenie i wyświetlanie wykresów i rysunków. Zawiera APIpylab
na wzórMatlaba
, zależna odNumPy
iPillow
. https://pypi.org/project/matplotlib/ https://matplotlib.org/stable/index.htmlScikit-Image
– biblioteka wspierająca rozmaite operacje przetwarzania obrazów, m.in. transformacje, filtrowanie, detekcję cech, segmentację, modyfikacje kolorystyczne https://pypi.org/project/scikit-image/ https://scikit-image.org/OpenCV
– biblioteka umożliwiająca rozpoznawanie obrazów, wpiera uczenie maszynowe, widzenie komputerowe i przetwarzanie obrazów https://pypi.org/project/opencv-python/ https://opencv.org/
Do zainstalowania tych bibliotek wykorzystujemy zestaw komend pip
:
pip install numpy
pip install Pillow
pip install matplotlib
pip install scikit-image
pip install opencv-contrib-python
W przypadku pracowania na terminalach należy zainstalować je jako wersje tylko dla bieżącego użytkownika:
pip install numpy --user
pip install Pillow --user
pip install matplotlib --user
pip install scikit-image --user
pip install opencv-contrib-python --user
Importujemy je standardowo do środowiska jako:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import skimage.io as io
import cv2
Obraz wyświetlany na ekranie komputera w modelu kolorów RGB rozumiemy jako siatkę pikseli, gdzie każdy piksel jest opisany przez trzy wartości, odpowiadające kanałom R (czerwony), G (zielony) i B (niebieski). Piksel czarny to \((0, 0, 0)\) dla obrazu uitn8
, #000000
w hex lub \((0, 0, 0)\) dla obrazu w float
, a piksel biały to \((255, 255, 255)\) dla obrazu uitn8
, #FFFFFF
w hex lub \((1, 1, 1)\) dla obrazu w float
. Wczytywanie obrazów przy użyciu poleceń Pythona może być wykonane na różne sposoby, jednakże dalsze kroki przetwarzania obrazu będą determinować, która biblioteka okaże się najbardziej przydatna. Standardowe operacje geometryczne znane z oprogramowania do obróbki grafiki rastrowej, takie jak obrót czy skalowanie, znajdziemy w bibliotece Pillow
. Bardziej zaawansowane przekształcenia, w bibliotekach Scikit-image
i OpenCV
. Jednakże, gdy spojrzymy na obrazy jak na macierze liczb, wówczas do operacji numerycznych najbardziej przydatna będzie biblioteka NumPy
, zaś do wizualizacji danych biblioteka Matplotlib
. Za algorytmami przetwarzania obrazów stoi wiele aspektów matematycznych, które będziemy próbować zrozumieć i zaimplementować samodzielnie bez użycia gotowych rozwiązań. Poniżej znajduje się kilka przydatnych poleceń, ze szczególnym uwzględnieniem biblioteki Matplotlib
.
Podstawowe informacje i komendy
Wczytywanie obrazów
#pillow = Image.open(‘nazwa_pliku.rozszerzenie’) obraz #matplotlib = plt.imread(‘nazwa_pliku.rozszerzenie’) obraz #skimage = io.imread(‘nazwa_pliku.rozszerzenie’) obraz #OpenCV = cv2.imread(‘nazwa_pliku.rozszerzenie’) obraz
Wyświetlanie obrazów
#pillow obraz.show()#matplotlib plt.imshow(obraz) plt.show()#skimage io.imshow(obraz)#OpenCV 'image', obraz) cv2.imshow(0) cv2.waitKey( cv2.destroyAllWindows()
Zapisywanie obrazów
#pillow obraz.save(‘nazwa_pliku.rozszerzenie’)#matplotlib plt.imsave(‘nazwa_pliku.rozszerzenie’, obraz, args)#skimage io.imsave(‘nazwa_pliku.rozszerzenie’,obraz)#OpenCV cv2.imwrite(‘nazwa_pliku.rozszerzenie’,obraz)
Sprawdzanie typu danych i rozmiaru wczytanego pliku
#pillow print(obraz.format) print(obraz.size) #matplotlib print(obraz.dtype) print(obraz.shape)
Zmiana przestrzeni koloru
Przekształcenie obrazu kolorowego do obrazu w skali odcieni szarości:
= 0.299 *R + 0.587* G + 0.114 * B Y= 0.2126 *R + 0.7152* G+ 0.0722 * B Y= cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY) Y = cv2.cvtColor(img_RGB, cv2.COLOR_RGB2GRAY) Y
Zamiana przestrzeni koloru przy wykorzystaniu OpenCV: Zamiana odbywa się przy użyciu odpowiedniej funkcji oraz Flagi określającej przestrzeń koloru zarówno źródła, jak i celu. Zmiany można dokonywać zarówno dla obrazów na
uint8
jak ifloat
. Pełna lista flag= cv2.cvtColor(img_RGB, cv2.COLOR_RGB2BGR) img_BGR
Zamiana przestrzeni koloru przy wykorzystaniu PIL: Poniżej kilka przykładów wykorzystania biblioteki PIL do zmiany przestrzeni koloru. Pełna list przestrzeni.
# Na Pillow Image 'CMYK`) img.conver(# Z i do numpy array na uint8 'RGB').convert('CMYK')) np.asarray(Image.fromarray(np.uint8(I), # Z i do numpy array na float *255), 'RGB').convert('CMYK'))/255 np.asarray(Image.fromarray(np.uint8(I
Przydatne przekształcenia
Wyświetlanie jednej warstwy/jednego kanału koloru obrazu:
plt.imshow(obraz[:,:,?])
Wyświetlenie obrazu w skali szarości (
vmin
ivmax
są opcjonalne):=’gray’, vmin=?, vmax=?) plt.imshow(obraz, cmap
Wyświetlanie wielu obrazów w jednym oknie:
#wiersze, kolumny, n - który z kolei plt.subplot(w, k, n)
Sprawdzenie wartości minimalnej/maksymalnej macierzy obrazu:
print(np.min(Y)) print(np.max(Y))
Zadania
- Zapisz dwa pliki wykorzystywane w ramach dzisiejszych zajęć: Prom kosmiczny oraz astronautkę
- Wczytaj oba zdjęcia za pomocą wszystkich bibliotek. Sprawdź, w jakiej formie są one wczytane (rodzaj zmiennej, typ danych).
- Spróbuj wyświetlić poszczególne wczytane obrazy za pomocą wszystkich bibliotek (każdy z wczytanych obrazów za pomocą jednej biblioteki można wyświetlić za jej pomocą, jak również za pomocą trzech pozostałych). Zaobserwuj, jakie są z tym problemy.
- Wyświetl obraz
spacecraft.png
w skali szarości – wykorzystajplt.imshow()
z parametrami uzupełniając odpowiednie wartości dlavmin
ivmax
. Następnie przypisz do zmiennej jeden kanał obrazu i wyświetl w ten sam sposób. Czy obrazy wyświetlają się poprawnie? Porównaj rozmiary obu zmiennych. Następnie przekształć obraz do skali odcieni szarości i porównaj obraz wyświetlony w skali szarości z obrazem przekształconym do skali szarości (Y
) - Przekształć oba obrazy do skali odcieni szarości i zapisz je do plików, deklarując odpowiednie parametry. Pliki powinny nazywać się odpowiednio
astronaut_gray.jpg
ispacecraft_gray.png
- Wykorzystując wiedzę ogólną, załączone odnośniki, załączone obrazy i samodzielnie generując dane testowe, odpowiedz na kilka pytań dotyczących innych przestrzeni koloru
CMYK
,YCbCr
,HSV
,Lab
itd.:- Jak zachowują się, pliki skonwertowane do innych przestrzeni koloru?
- Jakie zakresy wartości zajmują poszczególne warstwy?
- Jak to sprawdzić?