Feature space (old 2003)

This page is, evidently, in danish. It was part of an exercise for a university course some time back. I have not translated it into English, since I have no reason to believe there is a demand for it. If I am wrong, feel free to contact me and let me know.

Denne side er en html-udgave af en opgaveløsning for et kursus i mønstergenkeldelse og billedbehandling.

Edit: Indeholdet på denne side vil nok af mange blive betagtet som ret banalt, og det har de også ret i... på sin vis. Det afhænger jo af læserens eget udgangspunkt. Der var en gang hvor jeg selv syntes det var ret abstrakt. Tekstens mål er at forklare det helt grundlæggende princip med "feature space". Hvad det egentlig dækker over og hvordan det kan være smart til databearbejdning.

Jeg vil bruge betegnelsen "feature space" her og ikke forsøge en oversættelse til dansk.
Et feature space er et vektorrum hvor hver relevant egenskab ved en objekttype udgør en dimensionsakse. Med relevant egenskab mener jeg en egenskab som man vælger at anvende til at beskrive ens objekter og klasser.

Man kan eksempelvis beskrive en RGB farve som et objekt i et feature space med tre dimensioner, og lade hver af de tre farvekomponenter udgøre en dimensionsakse. En farve vil da være et punkt i ens vektorrum. Et andet eksempel kunne være geometriske former, hvor man ønsker at beskrive en gråtone farve, antallet af kanter, arealet og formens position i et xy-koordinatsystem. Det betyder at man beskriver 3 features for farve, kanter og areal og to features mere for x- og y-positionen. En sådan form kan altså beskrives som et punkt i et femdimensionelt vektorrum.

Herfra beskæftiger jeg mig kun med farver i et sådant rum. Bare husk at alt kan beskrives som punkter, flader etc i et feature space.

Farver i et feature space

Ofte angiver man en pixels farveværdi som dens RGB-værdi. Det vil sige hvor meget Rød, Grøn og Blå farven består af. Med RGB kan man repræsentere alle synlige farver. Hvis man lader farveværdierne variere mellem 0 og 1, så vil rød eksempelvis være (1,0,0) mens (1,1,0) vil være kraftig gul. Sort er (0,0,0) og hvid (1,1,1).

Istedet for at se det som tre abstrakte værdier der definerer en farve kan man se farven som et punkt i et 3D rum, hvor hver dimension er en farveakse. Det kan være rød grøn og blå. En farve med rgb-værdien (1,1,0.5) vil så ikke bare være 100% rød+100%grøn+50%blå, men istedet være et punkt i 3D med positionen (1, 1, 0.5).

Hvad er så fidusen ved denne ligegyldige ændring i synspunkt?

Vektorregning 

Det smarte ved dette vektor-synspunkt kan nemmest illustreres ved et spørgsmål.

Hvad er afstanden mellem grøn og gul?
Ser farverne som bare bestående af tre tal - her er det (0,1,0) og (1,1,0) - så er spørgsmålet som sådan meningsløst. Man kan naturligvis vælge at sige at man trækker dem fra hinanden og man får da (0,1,0)-(1,1,0). Nu er problemet så at udføre denne subtraktion, da man ikke har regneregler for farver. Skal man løse det som (0,1,0)-(1,1,0)=(0-1,1-1,0-0)=(-1,0,0) eller som (0,1,0)-(1,1,0)=1-2=-1, eller hvordan? Hvis man beregner to sådanne farveafstand, hvilken er så størst? Er der længere fra rød til grøn end fra gul til blå? Er (1,0,0) større end (1,1,1)?

Hvis man istedet ser farverne som vektorer i 3D, så findes der regneregler som angiver afstanden mellem de to farvepunkter i farverummet. Det er nu simpelt at beregne den virkelige afstand mellem to farvekoordinater.
Hvis første farve er (R1,G1,B1) og anden farve er (R2,G2,B2), så er den euklidske afstand
afstand=kvadratrod((R2-R1)^2 + (G2-G1)^2 + (B2-B1)^2). 
For blå (0,0,1) og gul (1,1,0) får man derfor at
afstand = kvadratrod((0-1)^2 + (0-1)^2 + (1-0)^2) = kvadratrod(1+1+1) = 1.73
Den euklidske afstand er længden af den lige linie mellem de to punkter i vektorrummet. Der findes andre afstandsmål, kaldet normer, hvoraf den euklidske norm kaldes 2-normen. Se evt Matrix and vector norms for yderligere beskrivelse af de forskellige typer.

Konklusion

Ved at betragte en farve som et punkt i et 3D farverum kan man foretage beregninger på farven, som ellers ikke var mulig. Man kan beregne afstand som demonstreret ovenfor, eller man kan opstille underrum for farverne og undersøge om en farve er med deri eller ej. Et eksempel på et underrum er linien fra (0,0,0) til (1,1,1) i farverummet. Alle punkter (farver) som findes på denne linie er gråtoner. Man kan angive et plan i farverummet, som adskiller farverne i to afdelinger. Et plan kunne eksempelvis være defineret som indeholdende punktet (0.5,0.5,0.5) og have normalvektoren (0.59,0.59,0.59). Alle farvepunkter over dette plan er lysere end alle punkter under planet. Man kan bruge det til at filtrere på lysstyrke.

Der er andre mere komplekse beregninger som kan udføres på farver hvis man ser dem som vektorer. Eksempelvis beregningen af Mahalanobis afstand, hvor man regner på om en given farve tilhører den ene eller anden undergruppe af farver. De eksempler jeg giver her har ikke så stor anvendelse i sig selv. De er ment som ilustrationer af hvad det vil sige at se farverne som punkter i et 3D rum.

Nogle eksempler

Et almindeligt billede anvendes til illustration af vektorbegrebet for farver. Bemærk at billedet har en stærk overvægt af røde og grønne farver.


Mængden af henholdsvis rød, grøn og blå ses her isoleret fra de andre komponenter i farverne. Man kan tydeligt se at rød og grøn er fremherskende, mens blå næsten kun forekommer som en del af de røde blomster.

Matlabkoden som indlæser og viser de tre billeder:
i=imread('gr.jpg');
figure;
image(i(:,:,1));
title('Red component');
colorbar;
figure;
image(i(:,:,2));
title('Green component');
colorbar;
figure;
image(i(:,:,3));
title('Blue component');
colorbar;

 
 
 


Betragter man billedets pixelfarver som punkter i et 3D rum, så får man en punktsky. Man kan se på punkternes position i farverummet at de primært er at finde ud mod den røde og grønne akse. Det stemmer overens med hyppigheden af henholdsvis rød, grøn og blå i billedet. Punktskyen er her tegnet i 3D fra tre forskellige synsvinkler. Husk at hvert punkt er en farve i billedet. Punktets position afgører hvilken farve. Er der flere pixels med samme farve, så tegnes deres punkter i samme position. Man kan ikke se hvor mange der er tegnet i en given position. Den blå linie viser hvor gråtonerne ligger. Linien starter i sort og går gennem alle gråtoner til hvid.
Akserne går ikke fra 0 til 1 men fra 0 til 255, da jeg her regner i 24 bit farver. Det vil sige at hver farvekomponent repræsenteres ved 8 bit. Det svarer til en værdi fra 0 til 255.

Matlabkoden som viser en punktsky

plot3(i(:,:,1),i(:,:,2),i(:,:,3),'r.');
axis([0 255 0 255 0 255]);
xlabel('Red');
ylabel('Green');
zlabel('Blue');
hold on;
%center gray line
l=plot3([0 255],[0 255],[0 255],'-b');
set(l,'LineWidth',2);
hold off;
grid on;


 
 
 
 



Antallet af pixels i et farveplan kan også vises. Hvis vi projekterer punktskyen ind på et plan, så vil nogen farvekombinationer være hyppigere end andre. Jeg kan illustrere dette ved at projektere skyen ind på de tre grundlæggende farveplaner; nemlig rød-grøn, rød-blå og grøn-blå. Disse planer ligger som siderne i den "kasse" som punktskyen er i. Man ser igen at rød og grøn er fremherskende, da det er ud langs de to akser at farverne er trukket. Den blå akse trækker ikke mange farver sin vej.

[rows cols colors]=size(i);
RG=zeros(256,256);
RB=zeros(256,256);
GB=zeros(256,256);

for cl=1:cols
for rw=1:rows
r=i(rw,cl,1)+1;
g=i(rw,cl,2)+1;
b=i(rw,cl,3)+1;
RG(r,g)=RG(r,g)+1;
RB(r,b)=RB(r,b)+1;
GB(g,b)=GB(g,b)+1;
end;
end;

figure;
image(RG);
xlabel('Green');
ylabel('Red');

figure;
image(RB);
xlabel('Blue');
ylabel('Red');

figure;
image(GB);
xlabel('Green');
ylabel('Blue');
 

Et eksempel på afstand mellem en grå farve midt mellem sort og hvid og så en rent rød farve. Den blå linie går fra den ene farve til den anden. Afstanden mellem de to farver er liniens længde. Bemærk at der ikke eksisterer nogle pixels i billedet med netop den gråtone eller totalt rød farve. Det gør i dette tilfælde bare linien lettere at se at den ikke er dækket af alt for mange røde klatter.