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%