Wprowadzenie do środowiska Matlabmichalbereta.pl/dydaktyka/KPO/Lab1/Matlab wprowadzenie.pdf ·...

25
Wprowadzenie do środowiska Matlab na potrzeby przedmiotu Komputerowe Przetwarzanie Obrazu Instytut Modelowania Komputerowego Politechnika Krakowska Ustawianie ścieżki do katalogów Dostęp do katalogów ustawia się w oknie Path Browser wywołanym przez File/Set Path. Save Path zapisuje modyfikacje ścieżek do pliku pathdef.m. Definicja zmiennych, wektorów i macierzy W Matlabie podstawową forma reprezentacji zmiennych jest macierz. Obejmuje to macierze jednowymiarowe (czyli wektory), macierze wielowymiarowe jak również macierz zmienne skalarne, które reprezentowane są jako macierz 1x1. Przykład 1: >> x = 22 x = 22 >> whos Name Size Bytes Class x 1x1 8 double array Grand total is 1 element using 8 bytes >> Zmienna x jest reprezentowana jako macierz 1x1. Przykład 2: wektor poziomy >> y = [1 2 3 4] y = 1 2 3 4 >> whos y Name Size Bytes Class y 1x4 32 double array Grand total is 4 elements using 32 bytes Przykład 3: wektor pionowy

Transcript of Wprowadzenie do środowiska Matlabmichalbereta.pl/dydaktyka/KPO/Lab1/Matlab wprowadzenie.pdf ·...

  • Wprowadzenie do środowiska Matlabna potrzeby przedmiotu

    Komputerowe Przetwarzanie ObrazuInstytut Modelowania Komputerowego

    Politechnika Krakowska

    Ustawianie ścieżki do katalogówDostęp do katalogów ustawia się w oknie Path Browser wywołanym przez File/Set Path. Save Path zapisuje modyfikacje ścieżek do pliku pathdef.m.

    Definicja zmiennych, wektorów i macierzy

    W Matlabie podstawową forma reprezentacji zmiennych jest macierz. Obejmuje to macierze jednowymiarowe (czyli wektory), macierze wielowymiarowe jak również macierz zmienne skalarne, które reprezentowane są jako macierz 1x1.

    Przykład 1:

    >> x = 22

    x =

    22

    >> whos Name Size Bytes Class

    x 1x1 8 double array

    Grand total is 1 element using 8 bytes

    >>

    Zmienna x jest reprezentowana jako macierz 1x1.

    Przykład 2: wektor poziomy

    >> y = [1 2 3 4]

    y =

    1 2 3 4

    >> whos y Name Size Bytes Class

    y 1x4 32 double array

    Grand total is 4 elements using 32 bytes

    Przykład 3: wektor pionowy

  • >> y = [1 ; 2 ; 3 ; 4]

    y =

    1 2 3 4

    >> whos y Name Size Bytes Class

    y 4x1 32 double array

    Grand total is 4 elements using 32 bytes

    lub przez transpozycję, którą w Matlabie zapisujemy jako ' (apostrof)

    >> z = [1 2 3 4]

    z =

    1 2 3 4

    >> z = z'

    z =

    1 2 3 4

    Można też:

    >> z2 = [1 2 3 4]'

    z2 =

    1 2 3 4

    Tworzenie macierzy dwuwymiarowych.

    Przykład 4: macierz pusta

    >> m = []

    m =

    []

  • Przkład: macierz 3x4

    >> m = [1 2 3 4 ; 5 6 7 8 ; 9 10 11 12]

    m =

    1 2 3 4 5 6 7 8 9 10 11 12

    Poszczególne wiersze oddzielone są średnikiem.Bardzo często przydatne są też funkcję tworzące macierze pewnego typu.

    eye(... , ...) tworzy macierz jednostkową (z jedynkami na diagonali)

    >> eye(3,3)

    ans =

    1 0 0 0 1 0 0 0 1

    Inne podobne funkcje, których znaczenie jest oczywiste, to:

    >> ones(2,3)

    ans =

    1 1 1 1 1 1

    >> zeros(3,2)

    ans =

    0 0 0 0 0 0

    >> rand(2,2)

    ans =

    0.9501 0.6068 0.2311 0.4860

    >> randn(2,2)

    ans =

  • -0.4326 0.1253 -1.6656 0.2877

    rand(...) zwraca macierz z losowymi wartościami o rozkładzie równomiernym, a randn(...) o rozkładzie normalnym.

    Zmienna ans zawsze przechowuje wynik ostatniej operacji.

    Odnoszenie się do pojedynczych elementów macierzy odbywa się poprzez indeksy.

    >> x = rand(2,3)

    x =

    0.8913 0.4565 0.8214 0.7621 0.0185 0.4447

    >> x(1, 2)

    ans =

    0.4565

    Indeksowanie jest od 1 a nie od zera !

    Przypisanie wartości jest analogiczne:

    >> x(1, 2) = 222

    x =

    0.8913 222.0000 0.8214 0.7621 0.0185 0.4447

    Można również posługiwać się zakresami, zarówno podczas tworzenia macierzy jak i odnoszenia się do ich elementów.

    Przykład 5: wektor z elementami od 1 do 10

    >> v = 1:10

    v =

    1 2 3 4 5 6 7 8 9 10

    Przykład 6: wektor z elementami od 1 do 10 z krokiem 0.8

    >> v = 1:0.8:10

    v =

    1.0000 1.8000 2.6000 3.4000 4.2000 5.0000 5.8000 6.6000 7.4000 8.2000 9.0000 9.8000

  • Podobnie dla macierzy:

    >> m = [ 1:2:10 ; 2:0.5:4]

    m =

    1.0000 3.0000 5.0000 7.0000 9.0000 2.0000 2.5000 3.0000 3.5000 4.0000

    Jeśli z macierzy chcemy pobrać np. drugą kolumnę lub trzeci wiersz, możemy napisać:

    >> x = rand(3,4)

    x =

    0.6154 0.7382 0.9355 0.8936 0.7919 0.1763 0.9169 0.0579 0.9218 0.4057 0.4103 0.3529

    >> y = x(:,2)

    y =

    0.7382 0.1763 0.4057

    >> z = x(3,:)

    z =

    0.9218 0.4057 0.4103 0.3529

    Albo bardziej skomplikowany „wycinek” z macierzy, np. wiersze od 2 do 4 oraz kolumny od 3 do 5:

    >> x = rand(5,6)

    x =

    0.8132 0.6038 0.4451 0.5252 0.6813 0.4289 0.0099 0.2722 0.9318 0.2026 0.3795 0.3046 0.1389 0.1988 0.4660 0.6721 0.8318 0.1897 0.2028 0.0153 0.4186 0.8381 0.5028 0.1934 0.1987 0.7468 0.8462 0.0196 0.7095 0.6822

    >> y = x(2:4,3:5)

    y =

    0.9318 0.2026 0.3795 0.4660 0.6721 0.8318 0.4186 0.8381 0.5028

  • W podobny sposób można robić również podstawienia:

    >> x = rand(2,3)

    x =

    0.3028 0.1509 0.3784 0.5417 0.6979 0.8600

    >> y = [ 22 22 22 ]

    y =

    22 22 22

    >> x(1,:) = y

    x =

    22.0000 22.0000 22.0000 0.5417 0.6979 0.8600

    Można też usunąć np. drugi wiersz danej macierzy w taki sposób:

    >> x = rand(3,4)

    x =

    0.1365 0.1991 0.2844 0.9883 0.0118 0.2987 0.4692 0.5828 0.8939 0.6614 0.0648 0.4235

    >> x(2,:) = []

    x =

    0.1365 0.1991 0.2844 0.9883 0.8939 0.6614 0.0648 0.4235

    Co się stanie, jeśli macierz x przypiszemy do zmiennej y a następnie zmienimy wartości elementów w y? Czy zmiana jest widoczna w x? Inaczej rzecz ujmując, czy operacja y = x dokonuje „głębokiej” kopii x, czy tylko kopuje referencje do x?

    >> x = zeros(3)

    x =

    0 0 0 0 0 0 0 0 0

    >> y = x

  • y =

    0 0 0 0 0 0 0 0 0

    >> y(1,1) = 22

    y =

    22 0 0 0 0 0 0 0 0

    >> x

    x =

    0 0 0 0 0 0 0 0 0

    Operacje na macierzach.

    Dwie macierze można pomnożyć, jeśli mają odpowiednie wymiary, tzn. jeśli liczba kolumn pierwszej jest równa liczbie wierszy drugiej.

    Przykład 7:

    >> x = rand(3,2)

    x =

    0.8537 0.8998 0.5936 0.8216 0.4966 0.6449

    >> y = rand(2,4)

    y =

    0.8180 0.3420 0.3412 0.7271 0.6602 0.2897 0.5341 0.3093

    >> z = x * y

    z =

    1.2923 0.5526 0.7718 0.8990 1.0280 0.4410 0.6413 0.6857 0.8320 0.3567 0.5139 0.5605

    Natomiast:

  • >> x = rand(3,2)

    x =

    0.8385 0.7027 0.5681 0.5466 0.3704 0.4449

    >> y = rand(3,4)

    y =

    0.6946 0.9568 0.1730 0.2523 0.6213 0.5226 0.9797 0.8757 0.7948 0.8801 0.2714 0.7373

    >> z = x * y??? Error using ==> *Inner matrix dimensions must agree.

    Pewnym wyjątkiem jest macierz 1x1, która reprezentuje wartość skalarną:

    >> a = 22

    a =

    22

    >> x = ones(3)

    x =

    1 1 1 1 1 1 1 1 1

    >> x = a*x

    x =

    22 22 22 22 22 22 22 22 22

    Jak widać, każdy element macierzy został pomnożony przez wartość 22.

    Oprócz operacji macierzowych, przez dodanie . (kropki) przy znaku działania, możemy wykonać dane działanie element po elemencie. Porównaj na przykład operacje macierzową mnożenia:

    >> x = 2 * ones(2)

    x =

  • 2 2 2 2

    >> y = 3 * ones(2)

    y =

    3 3 3 3

    >> z = x * y

    z =

    12 12 12 12

    >> z = x .* y

    z =

    6 6 6 6

    Inny przykład – chcemy każdy element macierzy (a nie całą macierz) podnieść do potęgi 3:

    >> x = 2 * ones(2)

    x =

    2 2 2 2

    >> x = x .^ 3

    x =

    8 8 8 8

    Podczas gdy podniesienie macierzy do potęgi 3 daje:

    >> x = 2 * ones(2)

    x =

    2 2 2 2

    >> x = x^3

    x =

    32 32 32 32

  • Inne operacje na macierzach

    A(:,end) - wypisanie ostatniej kolumnyA(end,:) - ostatni wierszsize(A) – pobieranie rozmiaru macierzy

    >> x = rand(3,4)

    x =

    0.9901 0.4983 0.3200 0.4120 0.7889 0.2140 0.9601 0.7446 0.4387 0.6435 0.7266 0.2679

    >> size(x)

    ans =

    3 4

    >> [wiersze, kolumny] = size(x)

    wiersze =

    3

    kolumny =

    4

    Tablice wielowymiarowe.Można również pracować z macierzami w większej niż 2 liczbie wymiarów.

    >> x = ones(2,3, 2)

    x(:,:,1) =

    1 1 1 1 1 1

    x(:,:,2) =

    1 1 1 1 1 1

    >> x(:,:,2) = x(:,:,2) * 22

    x(:,:,1) =

    1 1 1 1 1 1

  • x(:,:,2) =

    22 22 22 22 22 22

    >> x(2,1,1) = 333

    x(:,:,1) =

    1 1 1 333 1 1

    x(:,:,2) =

    22 22 22 22 22 22

  • Operacje arytmetyczne:Dodawanie C=A+B dodawanie Odejmowanie analogicznieMnożenie tablic „*”C = A * B mnożenie macierzy (suma iloczynów i-tego wiersza macierzy A i k-tej kolumny

    macierzy B)C=A.*B operacja tablicowa (mnożenie elementów o tych samych indeksach)DzielenieAnalogicznieW rachunku tablicowymC=A./BPotęgowanie C=A.^2 podniesienie do kwadratuPierwiastkowanieC=sqrt(A)Operacje transponowania „’ ”, operacje odwracania „inv”Transpozycja macierzy A.’Macierz odwrotnaC=inv(B)

    < A= A>=B Większy lub równy== A==B Równy ~= A~=B Różny od& and(A,B) AND – iloczyn logiczny| or(A,B) OR – suma logiczna~ not(A) NOT - negacja

    Xor xor(A,B) EXCLUSIVE OR – suma rozłączna

    Przykład 8:

  • >> x = rand(2,3)

    x =

    0.0164 0.5869 0.3676 0.1901 0.0576 0.6315

    >> y = rand(2,3)

    y =

    0.7176 0.0841 0.4418 0.6927 0.4544 0.3533

    >> x < y

    ans =

    1 0 1 1 1 0

    Jedynki wskazują te elementy, dla których warunek jest TRUE.

    Inne operacje:any(A) – zwraca 1 jeżeli któryś z elementów kolumny jest niezerowyall(A)- zwraca 1 jeżeli wszystkie elementy kolumny są niezerowefind – wyszukuje elementy spełniające dany warunek logiczny i

    „all” oraz „any” działają na kolumnach macierzy lub w przypadku wielowymiarowej – na pierwszym niejednoelementowym wymiarze

    Przykład 9: wyzerować elementy w x większe od 0.5x =

    0.1536 0.6992 0.4784 0.6756 0.7275 0.5548

    >> indx = find( x > 0.5 )

    indx =

    2 3 4 6

    >> x(indx) = 0

    x =

    0.1536 0 0.4784 0 0 0

    Lub krócej:x =

  • 0.1210 0.7159 0.2731 0.4508 0.8928 0.2548

    >> x( find(x>0.5) ) = 0

    x =

    0.1210 0 0.2731 0.4508 0 0.2548

    Zadanie: Dla dwóch macierzy o tym samym rozmiarze wyzeruj elementy na tych pozycjach, na których się różnią.

    Zadanie: Wypróbuj następujące funkcje:ZaokrągleniaWprowadzić wektor x = [2.2, -3.6; -4.7, 8.1]ceil (x) % zaokrąglenie w góręans = 3 -3 -4 9

    fix(x) % zaokrąglenie przez odcięcieans = 2 -3 -4 8

    floor(x) % w dółans = 2 -4 -5 8

    round(x) % do najbliższej całkowitejans = 2 -4 -5 8

    abs(x) % wartość bezwzględnaans = 2.2000 3.6000 4.7000 8.1000

    Budowa skryptu (tzw. M-pliku)

    Plik zawierający skrypt Matlaba (m-plik) to zwykły plik tekstowy zapisany z rozszerzeniem .m. Może zawierać sekwencje poleceń Matlab’a lub/i wywołania innych m-plikówMoże wywoływać sam siebie.

  • Są dwa rodzaje plików: skryptowe i funkcyjne.

    Skryptowe zawierają ciągi poleceń i działają na zmiennych dostępnych w przestrzeni roboczejmogą służyć do wprowadzania większej ilości danych, zapisu wyników, uproszczenia powtarzających się sekwencji, zapisu algorytmów. Mogą powstać konflikty nazw zmiennych w przestrzeni roboczej.

    Funkcyjne - algorytm funkcji na zmiennych lokalnych lub globalnych z przestrzenią roboczą Komunikują się przez zmienne globalne (definiowane poleceniem „global”) lub/i parametry formalnemuszą zaczynać się od „function”.

    function[lista argumentów wyjściowych]=nazwa_funkcji(lista argumentów wejściowych)

    Argumenty wejściowe i wyjściowe mają charakter lokalny.Nawias [] opuszcza się jeżeli jest jeden lub brak parametrów wyjściowych.

    Przykład 10:

    Zapisać jako pitagoras.m

    Funkcja pitagoras zwraca jedną wartość, mianowicie c. Zwróć uwagę, że a, b oraz c mogą być macierzami.

    Przykład wywołania:

    >> x = pitagoras(3,4)

    temp =

    25

  • c =

    5

    x =

    5

    A dla macierzy otrzymamy również poprawny wynik:

    >> a = [1 2; 3 4]

    a =

    1 2 3 4

    >> b = [2 3; 4 5]

    b =

    2 3 4 5

    >> x = pitagoras(a,b)

    temp =

    5 13 25 41

    c =

    2.2361 3.6056 5.0000 6.4031

    x =

    2.2361 3.6056 5.0000 6.4031

    Przykład funkcji, która nic nie zwraca. Pokazuje również jak wypisywać tekst oraz pobierać dane z klawiatury.

  • >> hello(3)

    hello, przeslales 3.000000

    podaj nowa wartosc:22

    x =

    22

    nacisnij cos by zakonczyc...

    do widzenia!

    Zadanie: Sprawdź co się stanie po wywołaniu:>> x = 33

    x =

    33

    >> hello(x)

    hello, przeslales 33.000000

    podaj nowa wartosc:22

    x =

    22

    nacisnij cos by zakonczyc...

    do widzenia!

    >> x

    .....

    Jaka będzie wartość x? Czy zmiana na 22 wewnątrz funkcji zmieniła wartość x w miejscu wywołania

  • czy zmieniła tylko kopie lokalną? Jaka będzie sytuacja, jeśli funkcja otrzyma macierz? Czy też wykona kopię głęboką tej macierzy?

    Oto funkcja, która zwraca dwie wartości (analogicznie jest dla trzech i więcej). Średnik na końcu linijki oznacza brak wypisania wyniku operacji na konsoli.

    Wywołanie:

    >> a = 3*ones(2)

    a =

    3 3 3 3

    >> b = 2*ones(2)

    b =

    2 2 2 2

    >> [xx yy] = mojafunkcja(a,b)

    xx =

    6 6 6 6

    yy =

  • 5 5 5 5

    Korzystanie z help'a:

    >> help mojafunkcja

    To jest opis funkcji

    A teraz krótki skrypt, który nie definiuje żadnej funkcji, ale za to pozwala zapisać i wykonać kilka operacji razem – w tym przypadku narysujemy wykres funkcji sinus oraz cosinus.

    Wywołanie:

    >> sinus

    Zmienne globalne (dostępne wszędzie – nawet w funkcjach) definiuje się za pomocą słowka global.

    Typy zmiennych w Matlabie

    Programowanie

  • Słowa kluczowe

    >> iskeyword

    ans =

    'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'

    if, else, elseif

    if logical_expression statementsend

    Np.

    if n < 0 % If n negative, display error message. disp('Input must be positive');elseif rem(n,2) == 0 % If n positive and even, divide by 2. A = n/2;else A = (n+1)/2; % If n positive and odd, increment and divide.end

    switch

    switch expression (scalar or string) case value1 statements % Executes if expression is value1 case value2 statements % Executes if expression is value2 . otherwise statements % Executes if expression does not match any caseend

  • Np.

    switch input_num case -1 disp('negative one'); case 0 disp('zero'); case 1 disp('positive one'); otherwise disp('other value');end

    while

    while expression statementsend

    Np.

    n = 1;while prod(1:n) < 1e100 n = n + 1;end

    for

    for index = start:increment:end statementsend

    Np.

    for i = 1:m for j = 1:n A(i,j) = 1/(i + j - 1); endend

    continue

    Np.

    fid = fopen('magic.m','r');count = 0;while ~feof(fid) line = fgetl(fid); if isempty(line) | strncmp(line,'%',1) continue end count = count + 1;

  • enddisp(sprintf('%d lines',count));

    break

    Np.

    fid = fopen('fft.m','r');s = '';while ~feof(fid) line = fgetl(fid); if isempty(line) break end s = strvcat(s,line);enddisp(s)

    Proste przykłady z przetwarzania obrazu

    Wpisz help imread aby sprawdzić jakie typy plików graficznych obsługuje Matlab.

    Przykład 11: m-plik simple_image_proc.m

    imfinfo('portret.jpg')disp('dalej...'); pauseim = imread('portret.jpg');imshow(im)disp('dalej...'); pause

    disp('zmiana mapy kolorow na hsv'); colormap(hsv)disp('dalej...'); pause

    disp('zmiana mapy kolorow na jet'); colormap(jet)disp('dalej...'); pause

    disp('zmiana mapy kolorow na losowa o 2 barwach'); colormap( rand(2,3) )disp('dalej...'); pause

    disp('zmiana mapy kolorow na losowa o 4 barwach'); colormap( rand(4,3) )disp('dalej...'); pause

    disp('zmiana mapy kolorow na losowa o 8 barwach'); colormap( rand(8,3) )disp('dalej...'); pause

    disp('zmiana mapy kolorow na losowa o 12 barwach'); colormap( rand(12,3) )

  • disp('dalej...'); pause

    disp('koniec...');

    Przykład 12: m-plik simple_image_proc2.m

    imfinfo('e0102.bmp')disp('dalej...'); pauseim = imread('e0102.bmp');imshow(im)disp('dalej...'); pause

    disp('tylko skladowa czerwona jako czarno-biala')imshow(im(:,:,1))disp('dalej...'); pause

    disp('tylko skladowa zielona jako czarno-biala')imshow(im(:,:,2))disp('dalej...'); pause

    disp('tylko skladowa niebieska jako czarno-biala')imshow(im(:,:,3))disp('dalej...'); pause

    disp('tylko skladowa czerwona z mapa kolorow')imshow(im(:,:,1))map = zeros(256, 3)map(:,1) = [0:(1/255):1]'colormap(map)disp('dalej...'); pause

    disp('tylko skladowa zielona z mapa kolorow')imshow(im(:,:,2))map = zeros(256, 3)map(:,2) = [0:(1/255):1]'colormap(map)disp('dalej...'); pause

    disp('tylko skladowa niebieska z mapa kolorow')imshow(im(:,:,3))map = zeros(256, 3)map(:,3) = [0:(1/255):1]'colormap(map)disp('dalej...'); pause

    disp('koniec');

    Sprawdzanie typu obrazu:

    isbw(A) – sprawdza, czy obraz jest binarnyisgray(A) – sprawdza, czy obraz jest obrazem o poziomach szarościisind(A) – sprawdza, czy obraz jest opisany macierzą indeksówisrgb(A) – sprawdza, czy obraz jest obrazem rgb

  • Inne informacje

    Znaki specjalne = przypisanie wartości[ ] tworzenie tablic, argumenty wyjściowe funkcji, łączenie macierzy (deklar. wartości, po=]{ }indeksy struktur i tablic komórkowych( ) argumenty wejściowe funkcji, indeksy tablic, nawiasy potrzebne do określenia kolejności działań (nigdy po =,). kropka dziesiętna, separator nazw obiektów, zamiana operacji macierzowej na tablicową… kontynuacja polecenia w następnym wierszu, separator poleceń, indeksów, argumentów funkcji; koniec wiersza macierzy, wstrzymanie wypisania wyniku% początek komentarza: generowanie wektorów, indeksowanie macierzy,‘ łańcuch (apostrof przed i po), operator transpozycji macierzy (po) lub sprzężenia

    Predefiniowane stałeInf (infinitive) to ∞1/0log(0) Uwaga:Inf-Inf and Inf/Inf dają w wyniku NaN (Not-a-Number)

    NaN (Not-a-Number)Wynik każdej operacji na NaN, np sqrt(NaN) (+Inf)+(-Inf) 0*Inf 0/0 oraz Inf/Inf

    Uwaga:Dwie NaN nie są sobie równe, zatem operacja logiczne na NaN dają zawsze 0 (fałsz), za wyjątkiem ~= (różny, nie równy)

    NaN ~= NaN ans = 1NaN == NaNans = 0NaN-y w wektorze traktowane jako różne niepowtarzalne elementy

    unique([1 1 NaN NaN]) %znajdź różne elementy wektoraans = 1 NaN NaNisnan([1 1 NaN NaN]) % isnan służy do wykrywania NaN w macierzy, zwraca 1, jeżeli jest gdzieś NaNans = 0 0 1 1