Laboratorium
Transkrypt
Laboratorium
Laboratorium Cyfrowe przetwarzanie obrazów Ćwiczenie 2 Transformacje kolorów Przekształcenia geometryczne dr inż Robert Kazała W języku Python należy zaimportować wybrany moduł. W przypadku korzystania z programu Spider domyślnie importowane są do zadanych przestrzeni nazw następujące moduły: import numpy as np, import scipy as sp, import matplotlib as mpl, import matplotlib.pyplot as plt. Biblioteka Matplotlib Ładowanie obrazów W celu załadowania obrazu z pliku można wykorzystać funkcję imread. Przykład wywołania funkcji do odczytania z pliku obrazu lena.jpg do zmiennej img jest następujący img=plt.imread('c:\Images\lena.jpg') img=plt.imread('c:\Images\stinkbug.png') Do odczytania rozmiaru obrazu, czyli ilości jego elementów należy odczytać właściwość size, np.: img.size Rozmiar dla poszczególnych współrzędnych przechowywany jest w właściwości shape, np.: img.shape Wyświetlanie obrazów imgplot = plt.imshow(img) W celu wyświetlenia pojedynczej tablicy można wykorzystać operatory zakresu imgplot = plt.imshow(img1[:,:,1]) Obraz wyświetlany ma domyślną mapę kolorów zwaną jet. Jeżeli chcemy wywietlić obraz z inną mapą kolorów należy podać parametr cmap imgplot = plt.imshow(img1[:,:,1], cmap=cm.hot) lub w innym zapisie imgplot = plt.imshow(img1[:,:,1], cmap='hot') Można także na wyświetlonym obrazie zmienić mapę kolorów wykonując polecenie imgplot.set_cmap('hot') Jeżeli chcemy wiedzieć jakiej wartości odpowiada dany kolor to możemy napisać plt.colorbar() Wyświetlony zostanie wtedy obok okna graficznego słupek z kolorami reprezentowanymi na obrazie. Przykład wyświetlenia map koloru dostępnych w bibliotece Matplotlib 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from pylab import * from numpy import outer rc('text', usetex=False) a=outer(arange(0,1,0.01),ones(10)) figure(figsize=(10,5)) subplots_adjust(top=0.8,bottom=0.05,left=0.01,right=0.99) maps=[m for m in cm.datad if not m.endswith("_r")] maps.sort() l=len(maps)+1 for i, m in enumerate(maps): subplot(1,l,i+1) axis("off") imshow(a,aspect='auto',cmap=get_cmap(m),origin="lower") title(m,rotation=90,fontsize=10) savefig("colormaps.png",dpi=100,facecolor='gray') Wykorzystanie własnych map koloru 1 from pylab import * 2 cdict = {'red': ((0.0, 0.0, 0.0), 3 (0.5, 1.0, 0.7), 4 (1.0, 1.0, 1.0)), 5 'green': ((0.0, 0.0, 0.0), 6 (0.5, 1.0, 0.0), 7 (1.0, 1.0, 1.0)), 8 'blue': ((0.0, 0.0, 0.0), 9 (0.5, 1.0, 0.0), 10 (1.0, 0.5, 1.0))} 11 my_cmap = matplotlib.colors.LinearSegmentedColormap('my_colormap',cdict,256) 12 pcolor(rand(10,10),cmap=my_cmap) 13 colorbar() Przykładowe obrazy #!/usr/bin/env python import numpy as np import matplotlib.cm as cm import matplotlib.mlab as mlab import matplotlib.pyplot as plt delta = 0.025 x = y = np.arange(-3.0, 3.0, delta) X, Y = np.meshgrid(x, y) Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) Z = Z2-Z1 # difference of Gaussians im = plt.imshow(Z, interpolation='bilinear', cmap=cm.gray, origin='lower', extent=[-3,3,-3,3]) plt.show() Biblioteka PIL Biblioteka Python Imaging Library zawiera szereg funkcji rozszerzających mozliwości języka Python w zakresie cyfrowego przetwarzania obrazów. Ładowanie biblioteki jako pil import Image as pil Załadowanie pliku im = pil.open("c:\Images\lena.png") Wyświetlenie informacji o załadowanym obrazie print im.format, im.size, im.mode Biblioteka PIL ma własną funkcję do wyświetlania obrazów, która wyświetla obraz w domyślnej przeglądarce systemu operacyjnego. im.show() W przypadku pracy interaktywnej w środowisku Spider wygodniej jest wykorzystywać funkce do Wyświetlania obrazu z pakietu Matplotlib. Wyświetlenie pliku z wykorzystaniem tej biblioteki img=plt.imshow(im) Biblioteka PIL ma własny format reprezentacji plików w przestrzeni roboczej. W celu wykonania konwersji na postać tablicową można wykorzystać funkcję fromimage z pakietu Scipy spimg=sp.fromimage(im) Jeżeli chcemy dokonać spłaszczenia obrazu do jednego wymiaru możemy wykorzystać parametr flatten spimgflat=sp.misc.fromimage(im,flatten=1) Jeżeli chcemy manipulować wybranym obszarem rysunku możemy użyć funkcji crop Przykład kopiowania wybranego obszaru box = (100, 100, 400, 400) region = im.crop(box) Jeżeli chcemy pracować w poszczególnych warstwach obrazu możemy dokonać podziału r, g, b = im.split() a następnie ponownego połączenia warstw im = pil.merge("RGB", (b, g, r)) Konwersje koloru Do dokonania konwersji koloru można wykorzystać metodę convert imconv= im.convert("L") Biblioteka wspiera konwersję pomiędzy każdym wspieranym formatem koloru i "L" lub "RGB". · 1 (1-bit pixels, black and white, stored as 8-bit pixels) · L (8-bit pixels, black and white) · P (8-bit pixels, mapped to any other mode using a colour palette) · RGB (3x8-bit pixels, true colour) · RGBA (4x8-bit pixels, true colour with transparency mask) · CMYK (4x8-bit pixels, colour separation) · YCbCr (3x8-bit pixels, colour video format) · I (32-bit integer pixels) · F (32-bit floating point pixels) Konwersja do postaci 1-bitowej imbit=im.convert("1") Wyświetlenie z interpolacją najbliższego sąsiada plt.imshow(imbit,interpolation='nearest') Transformacje geometryczne na płaszczyźnie Przesunięcie Przesunięcie (translacja) obrazu realizowana jest przez dodanie stałej do każdej współrzędnej, co w postaci macierzowej można przedstawić równaniem [ xy '' ]=[ xy ][tt ] x y Skalowanie Skalowanie polegające na zmianie rozmiaru obrazu względem początku układu współrzędnych w postaci macierzowej można opisać zależnością [ ][ ][ ] x' = sx 0 x y' 0 sy y Współczynnik skalowania s jest zwiększjący, jeżeli |s| > 1, a zmniejszający, jeżeli |s| < 1. Jeżeli s x = sy, to skalowanie nazywamy jednorodnym,a jeżeli sx ≠ sy niejednorodnym. Przy skalowaniu niejednorodnym proporcje skalowanego obiektu zmieniają się, natomiast przy skalowaniu jednorodnym proporcje nie ulegają zmianie. Obrót Obrót wokół początku układu współrzędnych o kąt φ można wyrazić w postaci macierzowej następująco [ xy '' ]=[cos sin −sin cos ][ ] x y W celu wykonania obrotu względem innego punktu niż początek układu współrzędnych należy 1. Wykonać przesunięcie płaszczyzny, aby punkt obrotu znalazł się w początku układu współrzędnych. 2. Dokonać obrótu wokół nowego początku układu współrzędnych o kąt φ. Współrzędne jednorodne Obiekty na płaszczyźnie mogą być przekształcane przez zastosowanie transformacji takich jak przesunięcia, skalowaania, obroty. Składanie transformacji polega na dodawaniu i mnożeniu odpowiednich macierzy. Złożenie obrotów i skalowań otrzymujemy przez mnożenie macierzy, natomiast przesunięciom odpowiada dodawanie wektora. Widoczna jest zatem pewna niedogodność, związana z tym, że nie można każdego przekształcenia przedstawić w postaci jednej macierzy (ponieważ przesunięcie jest realizowane inaczej niż skalowanie i obrót). Żeby móc traktować wszystkie trzy przekształcenia w jednakowy sposób i umozliwiść realizację dowolnego przekształcenia przez mnożenie macierzu należy zastosować alternatywny układ współrzędnych, w którym dowolne przekształcenie daje się opisać jako mnożenie przez macierz o wymiarach 3x3. Przekształcenie takie można opisać w sposób macierzowy zależnością [ ][ ][ ] a1 b1 c 1 x x' L x , y = y ' = a 2 b2 c 2 y 1 0 0 1 1 Poszczególne współrzędne po wyliczeniu mają postać x ' =a 1 xb1 yc 1 y ' =a 2 xb 2 yc 2 Z zależności widać, że w zależności od doboru współczynników macierzy można wykonywać zarówno translacje jak i obroty oraz skalowania. Transformacje 2D we współrzędnych jednorodnych Przesunięcie Macierz przesunięcia T(tx; ty) we współrzędnych jednorodnych ma postać [ ] 1 0 tx T t x , t y = 0 1 t y 0 0 1 Skalowanie względem początku układu współrzędnych [ ] sx 0 0 S s x , s y = 0 s y 0 0 0 1 Obrót wokół początku układu współrzednych [ cos −sin 0 R= sin cos 0 0 0 1 ] Skalowanie względem dowolnego punktu x0, y0 Sx 0, [ sx 0 sy y s x , s y = 0 0 0 0 ] x 0 1−s x y 0 1−s y 1 Obrót wokół dowolnego punktu [ cos −sin −x 0 cos y0 sin x 0 R x y = sin cos −x0 sin y 0 cos y0 0 0 1 0, 0 ] Zadania 1. Utworzyć funkcje do tworzenia obrazów testowych: linie, krata, szachownica. 2. Na wybranych obrazach dokonać konwersji pomiędzy różnymi reprezentacjami koloru. 3. Utworzyć własne funkcje realizujące przekształcenia geometryczne na podstawie przedstawionych wzorów, zaprezentować ich działanie na obrazach testowych i wybranych obrazach z plików.