Képfeldolgozás
Contents
Képfeldolgozás
Célunk, hogy felismerjünk a fényképen lévő filcek között a pirosakat.
clear all kep=imread('047.jpg'); % ez egy háromdimenziós tömb, az utolsó 3 elemű. Ebben van a különböző % színek intenzitása, míg az első két koordináta a pixel poziciója size(kep) % kép mérete
ans = 3456 4608 3
és a benne szereplő adatok típusa:
whos
Name Size Bytes Class Attributes ans 1x3 24 double kep 3456x4608x3 47775744 uint8
A kép tulajdonságainak vizsgálatához:
imtool(kep)
Színsíkok elkülönítése
voros=kep(:,:,1);
ez kizárólag a vörös színsíkot jeleníti meg, önmagában egy szürkeárnyalatos kép
zold=kep(:,:,2); kek=kep(:,:,3);
Ábrázoljuk az egyes színsíkokat!
subplot(2,2,1) imshow(voros) title('Vörös') subplot(2,2,2) imshow(zold) title('Zöld') subplot(2,2,3) imshow(kek) title('Kék') subplot(2,2,4) imshow(kep) title('Eredeti')
Kép szegmentálás
im2bw: fekete-fehér kép készítése a szürkeárnyalatos képből logikai változók mátrixaként gondolhatunk a maszkra
mask_voros=im2bw(voros,0.5);
legalább 0.5 erősségű a piros 0-1 skálán felhasználjuk a zöld színsíkot is, a piros kupakban kevés lesz a zöld
mask_zold=~im2bw(zold,0.25);
A két színre szűrés együtt:
maszk=mask_voros & mask_zold; subplot(2,2,1) imshow(mask_voros) % nem csak a kupak lesz fehér! title('Vörös') subplot(2,2,2) imshow(mask_zold); title('Nem zöld') subplot(2,2,3) imshow(maszk); title('Kettő együtt') subplot(2,2,4) imshow(kep) title('Eredeti')
Apró szemcsék eltüntetése
bwareaopen függvény eltünteni az apróbb szemcséket, és a kisebb összefüggő területeket, példuál ez a parancs eltünteti az 30 000 pixelnél kisebb egybefüggő területeket
maszk2=bwareaopen(maszk,30000); figure imshow(maszk2)
Warning: Image is too big to fit on screen; displaying at 25%
Kupak köré téglalap
A mask2 átlal talál összefüggő területek számát, és a köréjük írható legkisebb téglalapok méreteit a regionprops függvénnyel kérhetjük le:
kupakok=regionprops(maszk2, 'BoundingBox');
ennyi kupakot találtunk:
size(kupakok,1)
ans = 2
Ábrázolhatjuk is a körülfoglaló téglalapokat
imshow(kep) for i=1:size(kupakok,1) rectangle('Position',kupakok(i).BoundingBox,'LineWidth',2,'EdgeColor','g') end
Warning: Image is too big to fit on screen; displaying at 25%
Másik kép
kep=imread('050.jpg');
figure
imshow(kep);
voros=kep(:,:,1);
zold=kep(:,:,2);
kek=kep(:,:,3);
mask_voros=im2bw(voros,0.5);
mask_zold=~im2bw(zold,0.25);
maszk=mask_voros & mask_zold;
maszk2=bwareaopen(maszk,30000);
Warning: Image is too big to fit on screen; displaying at 25%
kupakok=regionprops(maszk2, 'BoundingBox'); %tulajdonságok kinyerése size(kupakok,1) %ennyi kupakot találtunk figure imshow(kep) for i=1:size(kupakok,1) rectangle('Position',kupakok(i).BoundingBox,'LineWidth',2,'EdgeColor','g') end
ans = 2 Warning: Image is too big to fit on screen; displaying at 25%
Zöld szín
És mi van a többi színnel? Vizsgáljuk meg újra a képet:
kep=imread('043.jpg'); imtool(kep) % A kék és a zöld között elég kicsi a különbség, így mindhárom színsíkot % felhasználjuk: voros=kep(:,:,1); zold=kep(:,:,2); kek=kep(:,:,3);
mask_zold= im2bw(zold,0.45); mask_voros=~im2bw(voros,0.25); mask_kek= ~im2bw(kek,0.5); maszk=mask_voros & mask_kek & mask_zold; imshow(maszk)
Warning: Image is too big to fit on screen; displaying at 25%
most kisebb lett az egyik kupak, ezért itt is kisebbre kell venni a pixelszámot
maszk2=bwareaopen(maszk,10000); imshow(maszk2)
Warning: Image is too big to fit on screen; displaying at 25%
kupakok=regionprops(maszk2, 'BoundingBox'); size(kupakok,1) imshow(kep) for i=1:size(kupakok,1) rectangle('Position',kupakok(i).BoundingBox,'LineWidth',2,'EdgeColor','r') end
ans = 3 Warning: Image is too big to fit on screen; displaying at 25%