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 xb1 yc 1
y ' =a 2 xb 2 yc 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
Sx
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.