Spis treści. Morfologia matematyczna. 1 Morfologia matematyczna 1.1 Dylacja 1.2 Erozja 1.3 Otwarcie i zamknięcie 1.

Podobne dokumenty
Ćwiczenia z przetwarzania tablic 2D

Ćwiczenia z mainuplacji obrazem rozpocznijmy od wczytania pliku, który będziemy przetwarzać. Dla fizyków medycznych naturalnie będzie to plik DICOM.

BIBLIOTEKA PROGRAMU R - BIOPS. Narzędzia Informatyczne w Badaniach Naukowych Katarzyna Bernat

Operacje morfologiczne w przetwarzaniu obrazu

Równania różniczkowe zwyczajne

Wykresy i interfejsy użytkownika

Warsztaty dla nauczycieli

Analiza i przetwarzanie obrazów

3. Macierze i Układy Równań Liniowych

Cyfrowe Przetwarzanie Obrazów i Sygnałów

Diagnostyka obrazowa

Rozwiązywanie problemów z użyciem Solvera programu Excel

Odciski palców ekstrakcja cech

Programowanie strukturalne i obiektowe. Funkcje

Diagnostyka obrazowa

Przetwarzanie obrazów wykład 7. Adam Wojciechowski

Maskowanie i selekcja

Spis treści. Optymalizacja jednowymiarowa

Wstęp do Programowania potok funkcyjny

FFT i dyskretny splot. Aplikacje w DSP

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Analiza obrazów - sprawozdanie nr 2

Filtracja obrazu operacje kontekstowe

WOJSKOWA AKADEMIA TECHNICZNA

W dowolnym momencie można zmienić typ wskaźnika.

Analiza obrazów - sprawozdanie nr 3

Przedmiotowy Konkurs Informatyczny LOGIA powołany przez Mazowieckiego Kuratora Oświaty

Zadania z rysowania i dopasowania funkcji

Wprowadzenie do Python

Języki formalne i automaty Ćwiczenia 9

CAM - zmiany w wersji 4.4.1

Zapis algorytmów: schematy blokowe i pseudokod 1

GIMP Grafika rastrowa (Ćwiczenia cz. 2)

Podstawy programowania w Pythonie

Celem tych ćwiczeń jest zapoznanie się z klasyfikacją za pomocą sieci neuronowych.

Przetwarzanie obrazów wykład 6. Adam Wojciechowski

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Filtracja obrazu operacje kontekstowe

Pętle. Dodał Administrator niedziela, 14 marzec :27

Cyfrowe przetwarzanie obrazów i sygnałów Wykład 10 AiR III

ZAZNACZENIA. Zaznaczenia (inaczej maski) służą do zaznaczania obszarów rysunku.

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Metoda Karnaugh. B A BC A

Diagnostyka obrazowa

Logika binarna. Prawo łączności mówimy, że operator binarny * na zbiorze S jest łączny gdy (x * y) * z = x * (y * z) dla każdego x, y, z S.

Politechnika Świętokrzyska. Laboratorium. Cyfrowe przetwarzanie sygnałów. Ćwiczenie 8. Filtracja uśredniająca i statystyczna.

Kolejne osoby możemy wyświetlać naciskając przyciski do przesuwania rekordów.

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Programowanie celowe #1

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Analiza i Przetwarzanie Obrazów

Nazwa wariantu modułu (opcjonalnie): Laboratorium programowania w języku C++

6. Algorytmy ochrony przed zagłodzeniem dla systemów Linux i Windows NT.

0 + 0 = 0, = 1, = 1, = 0.

Funkcja (podprogram) void

Adobe Photoshop lab. 3 Jacek Wiślicki, 1. Napisy (c.d.) Ogień Miód Metal Aqua...

Wstęp. Krystalografia geometryczna

Analiza obrazu. wykład 7. Marek Jan Kasprowicz Uniwersytet Rolniczy 2009

Programowanie dynamiczne

; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze...

Cyfrowe przetwarzanie obrazów. Dr inż. Michał Kruk

Wykład 2. Poprawność algorytmów

9. OBRAZY i FILTRY BINARNE 9.1 Erozja, dylatacja, zamykanie, otwieranie

Wstęp do wskaźników w języku ANSI C

Parametryzacja obrazu na potrzeby algorytmów decyzyjnych

Projekt z przedmiotu Systemy akwizycji i przesyłania informacji. Temat pracy: Licznik binarny zliczający do 10.

Informacja w perspektywie obliczeniowej. Informacje, liczby i obliczenia

Ćwiczenie 1 Galeria zdjęć

ALGORYTMY PRZETWARZANIA OBRAZÓW Projekt. Aplikacja przetwarzająca obrazy z możliwością eksportu i importu do programu MS Excel.

Obraz jako funkcja Przekształcenia geometryczne

Filtracja obrazów. w dziedzinie częstotliwości. w dziedzinie przestrzennej

4. Funkcje. Przykłady

Funkcje logiczne służą przede wszystkim do

Optymalizacja systemów

Teoretyczne podstawy informatyki

Wyjątki (exceptions)

Spośród licznych filtrów nieliniowych najlepszymi właściwościami odznacza się filtr medianowy prosty i skuteczny.

Metoda eliminacji Gaussa

Wyższa Szkoła Informatyki Stosowanej i Zarządzania WIT

01 grid tablica grid. Copyright 2017, mgr inż. Janusz Bonarowski 1

PROSTY PROGRAM DO MALOWANIA

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Podstawy programowania funkcjonalnego

1 Podstawy c++ w pigułce.

Ćwiczenie 1. Wprowadzenie do programu Octave

Zestaw C-11: Organizacja plików: Oddajemy tylko źródła programów (pliki o rozszerzeniach.cpp i.h)!!! Zad. 1: Zad. 2:

Grenlandia się topi badanie rozkładu kątów pomiędzy strumykami na lądolodzie na podstawie analizy obrazu

Wstęp do programowania

1 Pochodne wyższych rzędów

Program graficzny MS Paint.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

ROBOTYKA. Odwrotne zadanie kinematyki - projekt.

Języki formalne i automaty Ćwiczenia 5

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Grafika komputerowa. Zajęcia IX

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Transkrypt:

Spis treści 1 Morfologia matematyczna 1.1 Dylacja 1.2 Erozja 1.3 Otwarcie i zamknięcie 1.4 Filtr medianowy Morfologia matematyczna Morfologia matematyczna to bardzo przydatna metoda przetwarzania obrazów binarnych (czarnobiałych), pozwalająca na analizę i "upraszczanie" obserwowanych kształtów. W szczególności można ją zastosować do obrazów medycznych przetworzonych przez progowanie. Metody morfologii matematycznej pozwalają także na uspójnienie otrzymanego obrazu nie zmieniając jego rozmiarów zewnętrznych co może być bardzo przydatne przy dokonywaniu pomiarów w oparciu o cyfrowy obraz medyczny. Dla osób zainteresowanych bardziej formalną definicją poszczególnych operacji polecam bardzo szeroką literaturę dostępną w internecie. Tutaj przedstawimy definicję pozwalającą na łatwiejsze zrozumienie istoty działania poszczególnych operacji. Operacje morfologii matematycznej opierają się na tak zwanym elemencie strukturalnym, który my w uproszczeniu nazywać będziemy pędzlem (brush). Zacznijmy od zdefiniowania naszego obrazu roboczego i przykładowego pędzla. import numpy as np import pylab as py a=np.zeros((100,100),dtype=np.bool) a[30:50,30:50]=true a[50:70,50:70]=true brush7=np.array([[,,1,1,1,,],[,1,1,1,1,1,],[1,1,1,1,1,1,1],[1,1,1,1,1,1,1],[1,1,1,1,1,1,1],[,1,1,1,1,1,],[,,1,1,1,,]],dtype=np.bool) py.imshow(a, cmap=py.cm.gray, interpolation='nearest')

W definiowaniu funkcji morfologii matematycznej przydatna będzie procedura zmieniająca pędzel, będący kwadratową tablicą zer i jedynek na listę wektorów mających początek w środku pędzla i końce we wszystkich komórkach posiadających wartość 1. Kod takiej procedury przedstawia się następująco. def brush2list(brush): result=[] N=brush.shape[] middle=n/2 for x in range(n): for y in range(n): if brush[x,y]: result.append((x-middle,y-middle)) return result

Dylacja Pierwszą operacją którą omówimy jest dylacja. Nasz obraz w chwili obecnej składa się z tła zer (w kolorze czarnym) i dwóch kwadratów z jedynek (w kolorze białym). Wyobraźmy sobie, że nasz pędzel służy do malowania po obrazku. Jeżeli w jakimś miejscu przyłożymy środek pędzla, to wszystkie pixele, na których znajdą się jedynki w pędzlu zmienią swoją wartość na jeden. Operacja dylacji to przyłożenie środka pędzla do wszystkich komórek, których początkowa wartość to jeden. Równoważna jest także inna definicja. Przykładamy środek pędzla po kolei do wszystkich pixeli. Tworzymy listę wartości pixeli obrazu, które w danym ułożeniu pędzla odpowiadając wartościom 1 na pędzlu. Do pixela w którym znajduje się środek pędzla przypisujemy wartość będącą maksimum z tej list. Implementacja drugiej z tych definicji znajduje się poniżej. def dylacja(fig,brush=np.array([[,1,],[1,1,1],[,1,]],dtype=np.bool)): result=np.zeros(fig.shape) brush_list=brush2list(brush) for x in range(3,fig.shape[]-3): for y in range (3,fig.shape[1]-3): result[x,y]=max([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list]) return result py.imshow(dylacja(a,brush7), cmap=py.cm.gray, interpolation='nearest')

W efekcie dwa kwadraty powiększyły się i zaokrągliły im się rogi. Erozja Drugą operacją morfologii matematycznej jest erozja. Operacja jest analogiczna, z tą zmianą, że teraz nasz pędzel maluje na czarno i przesuwamy go po czarnych pixelach. Przy alternatywnej definicji przykładamy środek pędzla po kolei do wszystkich pixeli. Tworzymy listę wartości pixeli obrazu które w danym ułożeniu pędzla odpowiadając wartościom 1 na pędzlu. Do pixela w którym znajduje się środek pędzla przypisujemy wartość będącą minimum z tej list. Implementacja drugiej z tych definicji znajduje się poniżej. def erozja(fig,brush=np.array([[,1,],[1,1,1],[,1,]],dtype=np.bool)): result=np.zeros(fig.shape) brush_list=brush2list(brush) for x in range(3,fig.shape[]-3): for y in range (3,fig.shape[1]-3): result[x,y]=min([fig[x+x_shift,y+y_shift] for (x_shift,y_shift)

in brush_list]) return result py.imshow(erozja(a,brush7), cmap=py.cm.gray, interpolation='nearest') W wyniku tej operacji kwadraty nie zmieniły swojego kształtu, za to zmniejszyły się i powstała między nimi przerwa. Otwarcie i zamknięcie Skoro dylacja powiększa rozmiar naszego obrazu a erozja zmniejsza, naturalnym jest postawienie sobie pytania, co się stanie gdy obraz najpierw potraktujemy erozją a potem dylacją lub też odwrotnie. Operacje powstałe właśnie w ten sposób nazywamy otwarciem i zamknięciem. Ich definicja nie jest już problematyczna posiadając implementacje wcześniejszych metod.

def otwarcie(fig,brush=np.array([[,1,],[1,1,1],[,1,]],dtype=np.bool)): return dylacja(erozja(fig,brush),brush) def zamkniecie(fig,brush=np.array([[,1,],[1,1,1],[,1,]],dtype=np.bool)): return erozja(dylacja(fig,brush),brush) py.imshow(otwarcie(a,brush7), cmap=py.cm.gray, interpolation='nearest') py.imshow(zamkniecie(a,brush7), cmap=py.cm.gray, interpolation='nearest')

Wyniki powyższych dwóch operacji są najbardziej przydatne w zastosowaniach medycznych. W obu przypadkach rozmiary obrazu nie zmieniły się. W przypadku otwarcia rogi kwadratów zaokrągliły się i stykające się kwadraty stały się wyraźniej rozłączne. W przypadku zamknięcia obszar tworzony przez dwa kwadraty został uspójniony tworząc coś w rodzaju "mostu" między nimi. Przy zastosowaniu zamknięcia wszystkie obiekty odległe od siebie o mniej niż średnica pędzla zostaną połączone. Filtr medianowy W poprzednich metodach przykładaliśmy środek pędzla po kolei do wszystkich pixeli, tworzyliśmy listę wartości pixeli obrazu, które w danym ułożeniu pędzla odpowiadają wartościom 1 na pędzlu. Do pixela, w którym znajduje się środek pędzla przypisujemy wartość będącą minimum lub maksimum z tej list. Co się stanie gdy na wartościach z tej listy wykonamy jakieś inne operacje? Wzięcie średniej, jak wspominałem w poprzednim rozdziale, doprowadzi do rozmycia obrazka (średnia nie musi być zerem lub jedynką). Bardzo przydatną operację uzyskamy, gdy weźmiemy medianę z wartości w tej liście. Powstanie w ten sposób tak zwany filtr medianowy, który jest doskonałym narzędziem do usuwania szumu z obrazka. Jego implementacja wygląda na przykład tak.

def medianowy(fig,brush=np.array([[,1,],[1,1,1],[,1,]],dtype=np.bool)): result=np.zeros(fig.shape) brush_list=brush2list(brush) for x in range(3,fig.shape[]-3): for y in range (3,fig.shape[1]-3): result[x,y]=np.median([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list]) return result Aby przetestować działanie filtra medianowego musimy "zaszumić" nasz oryginalny obrazek for x,y in np.ndindex(a.shape): if (np.random.random()<0.05): a[x,y]=false if (np.random.random()>0.95): a[x,y]=true Zobaczmy teraz jakie wyniki da wielokrotne zastosowanie filtra medianowego. py.imshow(a, cmap=py.cm.gray, interpolation='nearest') a=medianowy(a) py.imshow(a, cmap=py.cm.gray, interpolation='nearest') a=medianowy(a) py.imshow(a, cmap=py.cm.gray, interpolation='nearest') a=medianowy(a) py.imshow(a, cmap=py.cm.gray, interpolation='nearest')

Jak widać udało się odtworzyć kształty widoczne nawet na obrazku bardzo słabej jakości. Operacje takie pozwalają znacznie poprawić jakość wyników uzyskiwanych poprzez progowanie obrazów medycznych. "Programowanie dla Fizyków Medycznych"