Projektarbete i Bildanalys vid Institutionen för Matematik Lunds Tekniska Högskola Segmentering Av: Karin Kolmert och Julia Stojanov Handledare: Björn Johansson 29 November, 2001
1 Inledning I detta projekt skulle olika segmenteringsmetoder provas och jämföras. Ursprunget till uppgiften var projektet Computer Vision for determination of Fridge Contents, se referens [1]. I kylskåpsprojektet skulle ett program skrivas för detektion av vad som fanns i kylskåpet. För att göra detta behövdes någon form av segmentering och sedan en igenkänningsalgoritm. I vårt projekt studerades en ketchupflaska respektive ett tomt kylskåp, se figur 1a och b. Koden för algoritmerna finns i bilaga 1. Figur 1a, b 2 Utförande 2.1 Kantdetektering En metod för att segmentera ut ett objekt är att först ta fram kanterna på objektet. Detta kan göras med hjälp av olika filter, se referens [2]. 2.1.1 Prewitt Först provades Prewitt-masken: 1 0 1 1 0 1 1 0 1 Detta är ett deriverings filter som tar fram en kant i taget. Genom att falta med denna mask fås kanterna fram i y-led. Transponeras den sedan fås kanterna i x-led fram. Dessa båda bilder kan kombineras och alla kanter träder fram. För att få fram tydligare kontraster trösklades bilden också. Se figur 2b. 2.1.2 Sobel Ett annat deriveringsfilter är Sobel-masken som även har en utjämnande effekt. Den ser ut så här:
1 2 1 0 0 0 1 2 1 För att få fram alla kanter görs likadant som ovan. Se figur 2d. 2.1.3 Laplace Laplace- masken ser ut så här: 0 1 0 1 4 1 0 1 0 Den tar fram kanter i både x- och y-led på en gång. Den är bruskänsligare än de ovannämnda filterna, vilket syns tydligt i figuren. Se figur 2c. Figur 2a, b, c, d 2.1.4 Jämförelser Som synes i bilderna blir det ingen större skillnad på Sobel- och Prewitt-filterna. Laplacefiltret är mer bruskänsligt än de båda andra. Det ger alltså inte lika bra resultat. 2.2 Segmentering 2.2.1 Differens av ketchupbild och bakgrundsbild För att kunna segmentera ut själva flaskan tas differensen mellan ketchupbilden och bakgrundsbilden. Då uppstår problem med skuggor. Dessa kan fås bort genom att tröskla ganska hårt. Se figur 3a. I figurens syns det att listen i kylskåpet dragits bort från flaskan och därför gjort ett hål i flaskans kontur. Genom att utföra slutning av bilden, det vill säga först dilatation och sedan erosion, kan kanten slutas. Se figur 3b. I denna bild finns det en del brus som även det har slutits och därför blivit större än vad det var från början. Detta plockas bort eftersom det är en ren ketchupbild som önskas. Se figur 3c. Det slutliga resultatet kan skådas i figur 3d.
Figur 3a, b, c, d 2.2.2 Ifyllnad av flaska Ytterligare ett sätt att segmentera fram flaskan är att utnyttja detekteringen av kanterna. Först används bilden av de kanter som var framtagna med Prewitt-masken, se figur 4b Eftersom det är en del hål i kanten så sluts bilden först. Detta görs som ovan, se figur 4c. I bilden syns brus och detta tas bort, se figur 4d. Nu är etiketten fortfarande kvar och eftersom det är enbart konturerna som önskas måste denna plockas bort. Detta görs genom att fylla i området mellan flaskans konturer, se figur 5a. Flaskan är nu fortfarande avgnagd upptill och dessa områden fylls i genom slutning, se figur 5b. Kanterna är här lite taggiga och därför görs en utjämning med hjälp av ett medelvärdesfilter, se figur 5c. Figur 4a, b, c, d Figur 5a, b, c, d Försöket upprepades med de bilder där kanterna var framtagna med Sobel- och Laplacefilterna. För Sobel-filtret blev resultatet identiskt med Prewitt-filtret eftersom ursprungsbilden var nästan identisk, se figur 2b och 2c. För Laplace blev resultatet inte bra med ifyllnadsmetoden. Detta beror på att det var för mycket brus och att kanterna inte var tillräckligt framtagna.
2.2.3 Snakes Den sista metoden som användes var Snakes, som är en form av Active contour. Active contour används för segmentering av dynamiska bilder och 3D-bilder. Snakes deformerar en kontur och stänger in de intressanta områdena som oftast är linjer eller kanter. Den kallas snakes eftersom de deformerade konturerna liknar en orm när de rör sig. Om en approximation av objektets kanter finns så kan active contour användas för att ta fram de riktiga kanterna. En active contour är en samling av n punkter i bildplanet. Dessa punkter itereras så att de närmar sig objektets kant genom en lösning av energiminimeringsproblemet. Se figure 8.6 (Referens [3]). I bild (a) syns Snakens punkter som en rak linje. I bild (b) har de börjat anpassa sig efter objektets konturer. Slutligen i bild (c) är minimeringen slutförd och de verklig konturerna träder fram. Snakes-algoritmen som användes i den här uppgiften är gjord av Ghassan Hamarneh, 23 maj 2000. I denna algoritm sattes först punkterna för ormen ut runt objektet. Därefter justerades olika parametrar till exempel tröskelvärde, ormens flexibilitet och att den drog sig mot mörka områden. När detta var gjort började iterationen och ormen slöt sig runt flaskan. Resultatet finns i figur 6. Figur 6
2.2.4 Jämförelser mellan segmenteringsmetoder Fördelen med differensmetoden är att den är enklare och därför snabbare. Tyvärr så blir inte flaskans konturer så jämna, utan de ändrar form lite grann. Halsen på flaskan blir dessutom smalare än ursprungsbildens hals och korken ändrar form. Ifyllnadsmetoden är mer komplicerad och tar längre tid att köra i Matlab. Den ger dock mycket bättre resultat med jämna konturer och normalstorlek på flaskan. Korken blir emellertid lite avklippt. Allra bäst resultat uppnås med snakes-metoden. Denna tar dock längre tid och även här så blir korken avskuren eftersom den har en annan färg än flaskan. Parametrarna måste också ändras från bild till bild. 3 Slutsats Vi har provat olika segmenteringsmetoder, från vanlig derivata och differens till mer komplicerade ifyllnadsmetoder och Snakes-metoden. Jämfört med resultaten i referens [1] har vi fått bort brus i bilden, vilket inte de har. Däremot är vår kork lite avklippt. Vilken metod som passar bäst beror på vilken bild man har, samt om man har en färdig Snakes-algoritm eller inte. 4 Referenser: [1] F. Färnström, B. Johansson, K. Åström. Computer Vision for determination of Fridge Contents. Paper, Center for Mathematical Sciences, Lund University, Sweden, 2001. [2] R.C. Gonzalez, R.E. Woods. Digital Image Processing. 1992, Addison-Wesley Publishing Company, Inc. [3] http://www.icaen.uiowa.edu/~dip/lecture/understanding2.html. 27/11-01
Bilaga 1 Deriveringsfilter % Prewitt ket=rgb2gray(imread('img001.jpg')); subplot(2,2,1) imagesc(ket) title('orginalketchupflaska') derx=[-1 0 1; -1 0 1; -1 0 1]; dery=derx'; falt1=conv2(ket,derx); falt2=conv2(ket,dery); gradabs=sqrt(falt1.^2+falt2.^2); subplot(2,2,2) imagesc(gradabs>50) title('prewitt, tröskel 50') % Laplace derx=[0-1 0; -1 4-1;0-1 0]; falt1=conv2(ket,derx); subplot(2,2,3) imagesc(falt1>5) title('laplace tröskel 5') % Sobel derx=[-1 0 1; -2 0 2; -1 0 1]; dery=derx'; falt1=conv2(ket,derx); falt2=conv2(ket,dery); gradabs=sqrt(falt1.^2+falt2.^2); subplot(2,2,4) imagesc(gradabs>65) title('sobel tröskel 65') Skillnad mellan bilder ket=rgb2gray(imread('img001.jpg')); tom=rgb2gray(imread('img000.jpg')); diff=double(ket)-double(tom); bild=(diff>-50); subplot(2,2,1) imagesc(bild) title('skillnaden mellan ketchupbilden och bakgrunden,trösklad') % Skapa en "ettor-bild" for i=1:size(bild,1) for k=1:size(bild,2) ett(i,k)=1; inv=ett-bild;
% Slutning se = strel('disk',55); utbild=imdilate(inv,se); utbild2=imerode(utbild,se); subplot(2,2,2) imagesc(utbild2) title('sluten bild') %Borttagning av brus [L,num]=bwlabel(utbild2); nybild=(l==2); subplot(2,2,3) imagesc(nybild) title('borttagning av brus') %Invers for i=1:size(nybild,1) for k=1:size(nybild,2) ett(i,k)=1; resultat=ett-nybild; subplot(2,2,4) imagesc(resultat) title('resultat') Ifyllnad med underprogram brusborttagning title('brusborttagen flaska') for i=1:482 % skapar två vektorer att stoppa in kantkoordinaten i v(i)=0; % och en differensvektor w(i)=0; avstand(i)=0; for i=1:482 % skapar en ny bild for k=1:642 bild2(i,k)=1; bild=fin; %storlek 482x642 for i=1:482 %från vänster (kanske) k=1; while bild(i,k)==0 & k~=642 % i är skilt från 640 (slut på bilden) k=k+1; if bild(i,k)==1 bild2(i,k)=0; v(i)=k; % om while-loopen stannar för att bilden är slut blir elementet i vektorn 481 (kanske problem)
for i=1:482 %från höger (kanske) k=642; while bild(i,k)==0 & k~=1 % i är skilt från 0 (slut på bilden) k=k-1; if bild(i,k)==1 bild2(i,k)=0; w(i)=k; % Sätta värdena mellan kanterna till 1 for i=1:482 avstand(i)=w(i)-v(i); % avstånd mellan flaskans kanter beräknas for s=v(i):(v(i)+avstand(i)) if avstand(i)~=0 & v(i)~=0 bild2(i,s)=0; % sätter pixlarna mellan flaskans kanter till 1 figure subplot(2,2,1) imagesc(bild2) title('ifylld flaska') % Skapa en "ettor-bild" for i=1:size(bild2,1) for k=1:size(bild2,2) ett(i,k)=1; res=ett-bild2; % Slutning se = strel('disk',55); utbild=imdilate(res,se); utbild2=imerode(utbild,se); subplot(2,2,2) imagesc(utbild2) title('sluten') % Utjämning filter=[1 1 1; 1 4 1; 1 1 1]; falt=conv2(utbild2,filter); subplot(2,2,3) imagesc(falt) title('utjämnad med medelvärdesfilter') %inversen for i=1:size(falt,1) for k=1:size(falt,2)
ett2(i,k)=1; res2=ett2-falt; subplot(2,2,4) imagesc(res2) title('resultat') Brusborttagning %prewittbilden sluten %områdessökning %ta bort små områden som är brus logisk %Gör slutning på prewittbild [L,num]=bwlabel(utbild2,8); %Delar upp bilden i num olika områden r1=1; l=0; for i=1:num [r,c]=find(l==i); %hittar det största sammanhängande området if length(r)>r1 r1=r; l=i; fin=(l==l); subplot(2,2,4) imagesc(fin) title('brus borttaget') Logisk prewitt % Slutning se = strel('disk',8); utbild=imdilate(bild,se); %figure %imagesc(utbild) % utbild2=imerode(utbild,se); subplot(2,2,3) imagesc(utbild2) title('sluten bild')