Ćwiczenia projektowe 1

0x08 graphic
0x08 graphic
0x01 graphic

1. Rozpoznawanie zmiany chorobowej w płucach

Przykład 1

Przykładowe rozpoznawanie zdjęć prostokątu i elipsy w Matlabie. Pokazana metoda nie jest odporna na błędy.

Stosujemy binaryzację i sumę wszystkich "białych" pikseli. W wyniku tego otrzymujemy 1 cechę obrazu, która będzie stosowana w etapie klasyfikacji.

[L1]=imread('prostokat1.tif');

L1 = double(L1)/255;

DOLNY_PROG = 0.9;

L2= L1 < DOLNY_PROG;

figure, imshow(L2);

P1=sum(sum(L2));

% wynik 69300

[L1]=imread('prostokat2.tif');

L1 = double(L1)/255;

DOLNY_PROG = 0.9;

L2 = L1 < DOLNY_PROG;

figure, imshow(L2);

P2=sum(sum(L2));

% wynik 68201

[L1]=imread('elipsa1.tif');

L1 = double(L1)/255;

DOLNY_PROG = 0.9;

L2 = L1 < DOLNY_PROG;

figure, imshow(L2);

E1=sum(sum(L2));

% wynik 63432

[L1]=imread('elipsa2.tif');

L1 = double(L1)/255;

DOLNY_PROG = 0.9;

L2 = L1 < DOLNY_PROG;

figure, imshow(L2);

E2=sum(sum(L2));

% wynik 56031

Stosujemy uproszczony algorytm najbliższego sąsiada z metryką Manhattan. wd=|a-b| gdzie wd - wartość bezwzględna z odległości; a, b - wektory cech.

Zakładamy, że prostokąt1 i elipsa1 są obrazami wzorcowymi, wynika z tego, że P1, E1 są wektorami wzorcowymi.

Zakładamy, że prostokąt2 i elipsa2 są obrazami nieznanymi, które stosujemy do identyfikacji.

Obliczamy odległości pomiędzy wektorami.

d1=((P2)-(P1))

wd1=(abs(d1))

%1099

d2=((P2)-(E1))

wd2=(abs(d2))

%4769

%Odległość wd1<wd2, a zatem metoda rozpoznała, że P2 jest prostokątem.

d3=((E2)-(P1))

wd3=(abs(d3))

%13269

d4=((E2)-(E1))

wd4=(abs(d4))

%7401

%Odległość wd4<wd3, a zatem metoda rozpoznała, że E2 jest elipsą.

Przykład 2

Poniżej przedstawiono program znajdujący guza w płucach z zastosowaniem współczynnika kompaktowości wko=(4πS/L2). Proszę przeanalizować działanie programu (zobacz Rys. 1). Program przeanalizować dla dwóch zdjęć '02_chory.tif' oraz '01_zdrowy.tif'.

0x01 graphic

Rys. 1. System rozpoznawania obrazów

Uwaga. W programie pominięto etap tworzenia wzorców do rozpoznawania. Użyto od razu gotowego wzorca prog = 0.7.

zmiany_chorobowe = 0;

[Rys] = imread('02_chory.tif'); % zamienić później na 01_zdrowy.tif

Rys=rgb2gray(Rys);

Rys = Rys>25;

BB1=bweuler(Rys);

H=fspecial('disk', 8);

F=imfilter(Rys, H);

figure, imshow(F, []);

hold on

BB2=bweuler(F); % bo 3-1=2 dla zdrowego 2-1=1

[B,L] = bwboundaries(F);

for n = 1:length(B)

boundary = B{n};

plot(boundary(:,2), boundary(:,1), 'b', 'LineWidth', 2)

end

Region = regionprops(L,'Area','Centroid', 'Perimeter');

prog = 0.7;

for n = 1:length(B) % iteracja po obiektach

boundary = B{n};

perimeter = Region(n).Perimeter;

area = Region(n).Area;

wko = 4*pi*area/perimeter^2; % współczynnik kompaktowości

wko_napis = sprintf('%4.2f',wko);

if (wko > prog)

zmiany_chorobowe = 1;

else

end

text(boundary(1,2),boundary(1,1)-20,wko_napis,'Color','g', 'FontSize',15,'FontWeight','bold');

end

if (zmiany_chorobowe == 1)

fprintf('Wykryto zmiany chorobowe \n');

else

fprintf('Brak zmian chorobowych \n');

end

Zadania

Zad 1

Dopisać kod programu, który będzie wyświetlać znalezionego guza jako czerwony okrąg. Użyć funkcji regionprops(), gdzie centroid() jest parametrem.

Zad 2

Dla dwóch zdjęć '02_chory.tif' oraz '01_zdrowy.tif' uwzględnić liczbę Eulera w rozpoznawaniu. Program ma działać tak aby brał pod uwagę dwie cechy: próg oraz liczbę Eulera.

Zad 3

Co stanie się, gdy nie użyjemy filtru wygładzającego krawędzie 'fspecial('disk', 8)' ?

Zad 4

Użyć innych filtrów takich jak:

a) h=[-1,-1,-1;0,0,0;1,1,1];

F=filter2(h,Rys);

b) F=wiener2(Rys, [3, 3]);

Zobaczyć różnice w wynikach.

Zad 5

Proszę zamienić współczynnik kompaktowości na współczynnik kołowości C1, C2, gdzie

C1=20x01 graphic
, C2=20x01 graphic
. Zaobserwować różnice w działaniu programu.

Techniki Obrazowania Medycznego

4