%------------------------------------------------------------------------ % 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 = 3 suorakumio = 2 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'); % muutetaan kuva binaarikuvaksi kynnys = graythresh(GRAY); BW = im2bw(GRAY, kynnys); figure, imshow(BW), title('binaarikuva'); % 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'); % 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