Gonzalez R., Woods R., Digital Image Processing 4th Edition, Pearson, 2017
Tadeusiewicz R., Korohoda P., Komputerowa analiza i przetwarzanie obrazów, FPT, Kraków, 1997
Cezary Bołdak, Wykłady z przedmiotu Cyfrowe Przetwarzanie Obrazów
Joanna Ratajczak, Wykłady z przedmiotu Cyfrowe Przetwarzanie Obrazów i Sygnałów
The website of the leading digital image processing books and other educational resources - http://www.imageprocessingplace.com/
Google AI Blog, Computer Vision - https://ai.googleblog.com/search/label/Computer%20Vision
Google AI Blog, Image Processing - https://ai.googleblog.com/search/label/Image%20Processing
Google AI Blog, Image Classification - https://ai.googleblog.com/search/label/Image%20Classification
Google AI Blog, Image Annotation- https://ai.googleblog.com/search/label/Image%20Annotation
M. A, Nielsen, Neural Networks and Deep Learning, Determination Press, 2015 - http://neuralnetworksanddeeplearning.com/index.html
I. Goodfellow, Y. Bengio, A. Courville, Deep Learning, The MIT Press, 2016 - http://www.deeplearningbook.org/
Przykładowy kod w języku Python przetwarzający obraz wczytany z pliku:
import numpy as np
from skimage.io import imread, imsave
from skimage.color import rgb2lab, lab2rgb
import matplotlib.pyplot as plt
im = imread('images/flowers.png')
im1 = rgb2lab(im)
im1 [..., 1] = im1 [..., 2] = 0
im1 = lab2rgb(im1)
imsave('flowers_gray.png', im1)
plt.figure(figsize=(10, 5))
plt.subplot(121), plt.imshow(im), plt.axis('off'), plt.title('Orginal image', size = 20)
plt.subplot(122), plt.imshow(im1), plt.axis('off'), plt.title('Gray scale image', size = 20)
plt.show()
Objaśnienie poszczególnych linii kodu:
import numpy as np - zaimportowanie biblioteki numpy i nadanie jej lokalnej nazwy np;
from skimage.io import imread, imsave - zaimportowanie funkcji imread oraz imsave z modułu io biblioteki skimage;
from skimage.color import rgb2lab, lab2rgb - zaimportowanie funkcji rgb2lab oraz lab2rgb z modułu color biblioteki skimage;
import matplotlib.pyplot as plt - zaimportowanie biblioteki pyplot i nadanie jej lokalnej nazwy plt;
im = imread('images/flowers.png') - wczytanie obrazu z pliku;
im1 = rgb2lab(im) - konwersja obrazu z przestrzeni barw RGB do CIELab;
im1 [..., 1] = im1 [..., 2] = 0 - wyzerowanie składowych obrazu odpowiedzialnych za chrominancję;
im1 = lab2rgb(im1) - konwersja obrazu z przestrzeni barw CIELab do RGB;
imsave('flowers_gray.png', im1) - zapisanie obrazu wynikowego do pliku;
plt.figure(figsize=(10, 5)) - stworzenie ilustracji o szerokości 10 cali i wysokości 5 cali;
plt.subplot(121), plt.imshow(im), plt.axis('off'), plt.title('Orginal image', size = 20) - narysowanie wewnątrz ilustracji oryginalnego obrazu;
plt.subplot(122), plt.imshow(im1), plt.axis('off'), plt.title('Gray scale image', size = 20) - narysowanie wewnątrz ilustracji wynikowego obrazu;
plt.show() - wyświetlenie ilustracji wraz z zawartymi w niej obrazami.
Wynik działania powyższego kodu.
Manipulacja jasnością obrazu
Należy wczytać obraz z pliku i wygenerować na jego podstawie dwa obrazy: jeden o zmniejszonej jasności, drugi - o zwiększonej jasności. W tym celu należy odpowiednio zmodyfikować składową obrazu odpowiedzialną za luminancję. Wygenerowane obrazy wraz z obrazem oryginalnym należy wyświetlić i zapisać do plików.
Transformacje afiniczne obrazu
Należy wczytać obraz z pliku i dokonać jego transformacji poprzez:
odbicie względem obu osi;
translację;
skalowanie;
rotację względem początku układu współrzędnych;
ścięcie w obu kierunkach;
złożenie wszystkich powyższych transformacji.
Wygenerowane obrazy wraz z obrazem oryginalnym należy wyświetlić i zapisać do plików.
Podpowiedzi:
Do wykonania transformacji należy wykorzystać funkcję affine_transform() z pakietu ndimage biblioteki scipy. Funkcja ta wykorzystuje macierze transformacji oraz współrzędne jednorodne. Transformacje możemy składać mnożąc ich macierze (operator @).
Macierze transformacji
Usuwanie szumu za pomocą filtrów
Należy wczytać obraz z pliku. Jeśli jest to obraz kolorowy należy przekonwertować go do skali szarości. Następnie należy wygenerować co najmniej trzy obrazy zawierające obraz wejściowy wraz z dodanym szumem. Następnie należy odfiltrować szum z każdego z obrazów na minimum dwa sposoby. Należy wyświetlić obraz oryginalny (w skali szarości) oraz dla każdego z zaszumionych obrazów: obraz przed filtracją, obrazy po filtracji każdą z metod, szum oraz histogram szumu. Dla każdego obrazu po filtracji należy policzyć i wyświetlić szczytowy stosunek sygnału do szumu (PSNR).
Podpowiedzi:
Konwersję obrazu do skali szarości można wykonać za pomocą funkcji skimage.color.rgb2grey(). Zaszumiony obraz można wygenerować bezpośrednio przy pomocy funkcji skimage.util.random_noise() lub skorzystać z funkcji dostępnych w pakiecie numpy.random (np. poisson). Do filtrowania można użyć funkcji z pakietu scipy.ndimage (np. uniform_filter czy median_filter). Histogram można wykonać za pomocą funkcji mathplotlib.pyplot.hist(). Wielkość PSNR można obliczyć za pomocą funkcji skimage.measure.compare_psnr().
Wyrównanie i skalowanie histogramu
Należy wczytać obraz z pliku. Jeśli jest to obraz kolorowy należy przekonwertować go do skali szarości. Następnie należy wygenerować dwa obrazy powstałe z obrazu oryginalnego poprzez wyrównanie i skalowanie jego histogramu (odpowiednio). Proszę wyświetlić obraz oryginalny oraz oba wygenerowane obrazy.
Podpowiedzi:
Procedura wyrównania histogramu:
Obliczenie histogramu h dla obrazu (funkcja histogram() z biblioteki NumPy)
Obliczenie histogramu kumulacyjnego hc na podstawie histogramu h za pomocą rekurencyjnego wyrażenia:
hc[0] = h[0]
hc[i] = h[i] + hc[i − 1] dla 1 <= i <= 255
Podobne działanie ma funkcja/metoda cumsum()
Wyznaczenie dla każdego punktu obrazu nowej wartości intensywności v′(x, y):
v′(x, y) = 255/(NM) · hc[v(x, y)]
gdzie v(x, y) jest intensywnością piksela obrazu źródłowego, N i M są rozdzielczością poziomą i pionową obrazu.
Skalowanie histogramu:
v′(x, y) = (v(x, y) - a) · (d - c )/(b - a )+ c
gdzie: v′(x, y) - wartość piksela obrazu wyjściowego, v(x, y) - wartość piksela obrazu źródłowego, a i b - zakres wartości, który ma być skalowany (z obrazu źródłowego), c i d - zakres docelowy skalowania (np. c=0, d=255)
Odtwarzanie uszkodzonych obrazów
Należy wczytać obraz z pliku. Następnie należy uszkodzić obraz poprzez usunięcie (wyzerowanie) pewnego zbioru pikseli (np. w kształcie jakiegoś napisu lub wzoru). Można w tym celu użyć innego obrazu binarnego (maski). Następnie należy odtworzyć obraz wykorzystując funkcję inpaint() oraz informację o tym, które piksele zostały uszkodzone (maskę). Proszę wyświetlić obraz oryginalny, uszkodzony oraz odtworzony.
Operacje morfologiczne
Należy wczytać obraz binarny (tylko białe i czarne piksele). Obraz taki można także uzyskać poprzez progowanie innego obrazu w skali szarości. Następnie należy na tym obrazie wykonać erozję, dylatację, otwarcie, zamknięcie oraz szkieletyzację. Proszę wyświetlić obraz oryginalny oraz pięć obrazów powstałych po przekształceniach.
Odpowiednie funkcje można odnaleźć w pakiecie skimage.morphology.
Segmentacja obrazu
Należy wczytać obraz. Następnie należy dokonać jego segmentacji dowolną metodą. Proszę wyświetlić obraz źródłowy oraz po segmentacji.
Klasyfikacja obrazów
Należy napisać kod, który będzie potrafił dowolną metodą stwierdzić, czy wczytany obraz jest zdjęciem kwiatu słonecznika czy nie. Proszę podać przykład działania dla 10 różnych zdjęć (w tym pięciu słoneczników).
Wykrywanie obiektów
Należy wczytać obraz przedstawiający ruch uliczny. Na wczytanym obrazie należy dowolną metodą oznaczyć przechodniów oraz samochody.
Sandipan Dey, Python Image Processing Cookbook, Packt, 2020
Sandipan Dey, Hands-On Image Processing with Python: Expert techniques for advanced image analysis and effective interpretation of image data, Packt, 2018
Marcin Denkowski, Paweł Mikołajczak, Przetwarzanie obrazów cyfrowych – laboratorium, UMCS, 2011
Python - a programming language that lets you work quickly and integrate systems more effectively - https://www.python.org/
PyPI (The Python Package Index) - a repository of software for the Python programming language - https://pypi.org/
NumPy - package for scientific computing - https://numpy.org/
SciPy (pronounced “Sigh Pie”) - a software for mathematics, science, and engineering - https://www.scipy.org/
scikit-image - a collection of algorithms for image processing - https://scikit-image.org/
OpenCV (Open Source Computer Vision Library) - a computer vision and machine learning software library - https://opencv.org/
Matplotlib - a comprehensive library for creating static, animated, and interactive visualizations - https://matplotlib.org/
simpletik - multi-dimensional image analysis - https://simpleitk.org/
PyWavelets - Wavelet Transforms - https://pywavelets.readthedocs.io/en/latest/
MedPy - a library and script collection for medical image processing - https://pypi.org/project/MedPy/
scikit-learn - Machine Learning - https://scikit-learn.org/stable/
PyStasm - software library for finding features in faces - https://pythonhosted.org/PyStasm/
DeepLab - Deep Labelling for Semantic Image Segmentation - https://github.com/tensorflow/models/tree/master/research/deeplab
TensorFlow - An end-to-end open source machine learning platform - https://www.tensorflow.org/
Keras - Deep learning for humans - https://keras.io/
PyTorch - An open source machine learning framework - https://pytorch.org/
Dlib - modern toolkit containing machine learning algorithms and tools for creating complex software to solve real world problems - http://dlib.net/
deepface - Lightweight face recognition and facial attribute analysis (age, gender, emotion and race) - https://pypi.org/project/deepface/
FaceNet - Face Recognition using Tensorflow - https://github.com/davidsandberg/facenet