Laboratorium 4

Marek Kociński & Anna Borowska-Terka

Wyświetlanie obrazów. Funkcja imshow()

[26,27,28.03.2018 i 04,09,10.04.2018]

Zadania do wykonania

  1. Zapoznaj się z wybranymi funkcjami z pakietu matplotlib.pyplot. Utwórz "mały" obraz 2D img = np.arange(24).reshape(4,6). Sprawdź wybrane argumenty funkcji imshow(...) oraz inne funkcje które są pomocne przy wyświetlaniu obrazów dwuwymiarowych (macierzy 2D), np.:

    • dostępne mapy kolorów (imshow(...)),
    • rodzaje interpolacji (imshow(...),
    • położenie początku układu współrzędnych obrazu (imshow(...)),
    • funkcja colorbar(),
    • włącz/wyłącz ozanczenia osi: axis('on') axis('off'),
    • nadaj tytuły osi, tytył wykresu.
  2. Zapoznaj się z funkcjami, które zapisują i odczytują obrazy do/z plików dyskowych. Sprawdź składnie tych funkcji oraz dostępne formaty plików (.bmp,.png,.pdf,...) dla każdej funkcji (pakietu). Zapoznaj się z odpowiednimi funkcjami z pakietów matplotlib.pyplot i scipy.misc.

    • plt.imread(...) / plt.imsave(...),
    • misc.imread(...) / misc.imsave(...),
    • wczytaj kilka obrazów (brain1.bmp, gdansk.bmp) z katalogu dane2D. Katalog z obrazami 2D jest dostępny na stronie www przedmiotu w postaci spakowanej (dane2d.zip).
  3. Napisz funkcję, która wypisuje podstawowe informacje o obrazie: typ danych, wymiar, rozmiar, liczba pikseli, wartość minimalna, wartość maksymalna, wartość średnia, odchylenie standardowe wartośći (jasności) elementów obrazu.

  4. Napisz funkcję, która generuje poniższe wzory w macierzy o rozmiarze (100,200, dtype='uint8'). Wyniki uzyskaj w dwojaki sposób: za pomocą pętli for oraz macierzowo (z wykorzystaniem "slice'ingu"). Wzory podane są poniżej w omówieniu zadania 4.

  5. Napisz funkcję, która w obrazie wypełnionym zerami o rozmiarze (100x100) 'rysuje' prostokąt o zadanym położeniu (należy podać współrzędne jednoznacznie określające położenie prostakąta), o zadanej wartości (np. val=255, val=1) i typie danych (np. typ='uint8', typ='float32'). Funkcja może wyglądać następująco: rysuj_kwadrat(y1,y2,x1,x2,typ='uint8',val=255)

  6. Za pomocą funkcji rysuj_kwadrat(...) wygeneruj trzy obrazy oraz wyświetl je za pomocą funkcji wyswietl3(...) z Lab. 3:

    • r: y1=20, y2=60, x1=20, x2=60, float, val=1.0,
    • g: y1=30, y2=70, x1=40, x2=80, float, val=1.0,
    • b: y1=40, y2=80, x1=30, x2=70, float, val=1.0.
  7. Samodzielnie utwórz obraz RGB ze składowych r,g,b zawierających odpowiednio wygenerowane kwadraty.
  8. Wczytaj obraz gdansk.bmp. Wyświetl jego poszczególne składowe: r,g,b. Zamień kolejność kanałów RGB na BGR.

  9. Napisz funkcję która zamienia obraz RGB na obraz w skali szarości wg. wzoru $$ Y = 0.2125 R + 0.7154 G + 0.0721 B$$.

Wybrane zagadnienia z laboratorium

In [11]:
import os
import numpy as np
from scipy.misc import ascent, face
import matplotlib.pyplot as plt

import pp_lab_4 as lab4
import pp_lab_3_pd as lab3_pd

zadanie 3 - funkcja info()

def info(obraz,name='---'):

"""
Funkcja wypisuje informacje o obrazie

[data utworzenia definicji funkcji]

Pamiętaj: to jest miejsce na Twój opis działania funkcji. 
"""

Tutaj napisz samodzielnie ciało funkcji, której argumentami są: obraz oraz opis obrazu. 
Funkcja ma za zadanie wyświetlać następujące informacje o podanym obrazie: 
- typ danych,
- wymiar (wysokość x szerokość)
- rozmiar (liczba elementów w macierzy),
- liczba pikseli,
- wartość minimalna,
- wartość maksymalna, 
- wartość średnia, 
- odchylenie standardowe wartośći (jasności) elementów obrazu.
In [2]:
# testujemy działanie funkcji:
img1 = ascent()
img2 = face()
lab4.info(img1, 'Obraz Ascent')
print '*' * 10
lab4.info(img2, 'Obraz Face')
Obraz Ascent, dtype=int64:, shape=(512,512), size=262144
Obraz Ascent, max=255.00:, srednia=87.48, min=0.00, std=48.77
**********
Obraz Face, dtype=uint8:, shape=(768,1024), size=2359296
Obraz Face, max=255.00:, srednia=110.16, min=0.00, std=57.51

zadanie 4 - "wzory" w macierzach

def linie_macierzowo():

"""
Funkcja tworzy cztery 'wzorzyste' macierze w sposób macierzowy i je wyświetla w dwóch rzędach i dwóch kolumnach.
[data utworzenia definicji funkcji]

Pamiętaj: to jest miejsce na Twój opis działania funkcji. 
"""

Tutaj napisz samodzielnie ciało funkcji, która wygeneruje serie poniższych czterech obrazków. W tym celu:
1. Utwórz cztery macierze. Każda macierz ma rozmiar (100,200, dtype='uint8'). 
2. Tak zmodyfikuj macierze, metodą 'macierzową', aby po ich wyświetleniu uzyskać poniższe wykresy.
3. Wykorzystaj definicję funkcji z poprzedniego laboratorium służącą do wyświetlenia kilku zmiennych. Nie kopiuj tej definicji do dzisiaj tworzonego skryptu. Wykorzystaj już istniejący plik z definicją i użyj polecenia import.
In [3]:
%matplotlib inline
lab4.linie_macierzowo()

zadanie 4 - "wzory" uzyskane za pomocą pętli for

def linie_for():

"""
Funkcja tworzy cztery 'wzorzyste' macierze korzystając z pętli for oraz wyświetla je w dwóch rzędach i dwóch kolumnach.
[data utworzenia definicji funkcji]

Pamiętaj: to jest miejsce na Twój opis działania funkcji. 
"""

Tutaj napisz samodzielnie ciało funkcji, która wygeneruje serie poniższych czterech obrazków. W tym celu:
1. Utwórz cztery macierze. Każda macierz ma rozmiar (100,200, dtype='uint8'). 
2. Tak zmodyfikuj macierze, za pomocą pętli for, aby po ich wyświetleniu uzyskać poniższe wykresy.
3. Wykorzystaj definicję funkcji z poprzedniego laboratorium służącą do wyświetlenia kilku zmiennych. Nie kopiuj tej definicji do dzisiaj tworzonego skryptu. Wykorzystaj już istniejący plik z definicją i użyj polecenia import.
In [4]:
lab4.linie_for()

zadanie 6 - 'rysowanie' kwadratów

In [5]:
r = lab4.rysuj_kwadrat(20,60,20,60,'float',1.0)
g = lab4.rysuj_kwadrat(30,70,40,80,'float',1.0)
b = lab4.rysuj_kwadrat(40,80,30,70,'float',1.0)
lab3_pd.wyswietl3([r,g,b],tyt=['r','g','b'])

zadanie 7 - tworzenie obrazu RGB

In [6]:
rgb = lab4.obraz_RGB(r,g,b)
plt.imshow(rgb)
Out[6]:
<matplotlib.image.AxesImage at 0x7fe7c3b3cc50>

zadanie 8 - składowe obrazu gdansk.bmp

W celu wykonania zadania, ściągnij ze strony przedmiotu, paczkę .zip z obrazami do wczytania: 2016_Dane_2d (paczka zip) i użyj pliku, np.: gdansk.bmp, mak.bmp.

In [7]:
img = plt.imread(os.path.join('dane','gdansk.bmp'))
print img.shape
lab4.pokaz_skladowe_RGB(img)
(1944, 2592, 3)

Zamiana kolejności składowych RGB na BGR

In [8]:
lab4.pokaz_zmieniona_kolejnosc_skladowych(img)

zadanie 9 - zamiana obrazu RGB do skali szarości

In [9]:
y = 0.2125*r + 0.7154*g + 0.0721*b
plt.imshow(y,cmap='gray',interpolation='None')
Out[9]:
<matplotlib.image.AxesImage at 0x7fe7c353be50>

Praca domowa

  1. Sprawdż jak wczytać i zapisać obraz w innych pakietach między innymi do przetwarzania obrazów 2D:
    • Python Imaging Libraty (Image.open / Image.save)
    • OpenCV
  2. Napisz funkcję, która w obrazie (100x100) generuje koła o zadanym promieniu i współrzędnych środka.
In [10]:
a = lab4.rysuj_kolo(40,40,10)
b = lab4.rysuj_kolo(70,70,25)
c = a + b
lab3_pd.wyswietl3([a,b,c])