Ćwiczenia projektowe 1
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'.
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=2
, C2=2
. Zaobserwować różnice w działaniu programu.
Techniki Obrazowania Medycznego
4