%------------------------------------------------------------------------
% Eri muotoisten kappaleiden luokittelu
% 1: luetaan kuva
% 2: muunnetaan kuva harmaasavykuvaksi
% 3: kynnystetaan kuva
% 4: invertoidaan binaarikuva
% 5: Etsitaan ulkorajat
% 6: Maaritellaan muotojen ominaisuudet
% 7: Luoitellaan ominaisuudet
% nelio nelio = 3
% suorakumio = 2
% ympyra ympyra = 1
% tuntematon = 0
%------------------------------------------------------------------------
function lajittele()
RGB = imread('testikuva.bmp')
figure,
imshow(RGB),
title('alkuperainen kuva');
% muunnetaan harmaasavykuvaksi
GRAY = rgb2gray(RGB);
figure,
imshow(GRAY),
title('harmaasavykuva');
% Step 3: Threshold the image Convert the image to black and white in order
% to prepare for boundary tracing using bwboundaries.
threshold = graythresh(GRAY);
BW = im2bw(GRAY, threshold);
figure,
imshow(BW),
title('Binary Image');
% invertoidaan kuva
BW = ~ BW;
figure,
imshow(BW),
title('invetoitu kuva');
% Haetaan osien rajat. Kaytetaan rajoitetta noholes , ei olla kiinnostuneita rei'ista
[B,L] = bwboundaries(BW, 'noholes');
% Haetaan ominaisuudet
STATS = regionprops(L, 'all'); % we need 'BoundingBox' and 'Extent'
% luokitellaan kuva ominaisuuksien perusteella
% Nelio = 3 = (1 + 2) = (X=Y + Extent = 1)
% Suorakumio = 2 = (0 + 2) = (only Extent = 1)
% Ympyra = 1 = (1 + 0) = (X=Y , Extent < 1)
% tuntematon = 0
%Extent =area/BoundingBoxArea
figure,
imshow(RGB),
title('Tulokset');
hold on
for i = 1 : length(STATS)
W(i) = uint8(abs(STATS(i).BoundingBox(3)-STATS(i).BoundingBox(4)) < 0.1);
W(i) = W(i) + 2 * uint8((STATS(i).Extent - 1) == 0 );
centroid = STATS(i).Centroid;
switch W(i)
case 1
plot(centroid(1),centroid(2),'wO');
case 2
plot(centroid(1),centroid(2),'wX');
case 3
plot(centroid(1),centroid(2),'wS');
end
end
|