Denne øvelse udgør de indledende skridt til en endelig funktion, som skal kunne lave mosaikker af billeder; hver pixel i et brugerbestemt billede skal erstattes med en lille thumbnail, så fx det klassiske billede af Jack Nicholson fra The Shining kan opbygges af en masse portrætter af skuespillere; se nederst på siden.
I første omgang skal I opbygge en funktion, som kan læse et bibliotek af små billeder (thumbnails), og resize dem, så de allesammen har samme dimensioner. Derudover skal middelværdien for farven i billedet udregnes. Thumbnails og farveværdier skal derpå gemmes i en mat-file til senere brug.
Instruktioner:
- Hent Mosaic filerne her.
- Lav et nyt bibliotek kaldet Mosaic og pak filerne ud heri. HUSK at gemme alle de dannede funktioner heri.
- Lav en funktion og kald den resizeThumbs
- Den skal ikke have noget output, men skal modtage to input argumenter:
- En tekst-streng, som indeholder navnet på et bibliotek - kald den sti
- En variabel til at indeholde den ønskede størrelse - kan den str
- Den skal ikke have noget output, men skal modtage to input argumenter:
- Lav en waitbar - gem et handle i en variabel ved navn wb. Giv den en relevant titel.
- Lav en liste over jpg filer i den angivne sti
- Hint: lav en concatenation af sti og \*.jpg
- Fx thumbnails\actors\ac1.jpg
- Lav en variabel, som indeholder antallet af filer - kald den num_filer
- Lav to celle-strukturer, som skal indeholde thumbs og RGB_val - det er mest effektivt, når man bruger for løkker, at "præ-allokere" de variable, som ændrer størrelse under løkken
- Brug kommandoen
- cell(num_filer,1)
- Brug kommandoen
- Lav en for løkke, som kører fra en til antallet af filer i num_filer
- Indlæs det aktuelle billede (filer(i).name
- Brug concatenation til at klistre stien foran filnavnet
- Skaler billedet til den ønskede størrelse:
- res_im = uint8(imresize(im, [str str]));
- Gem res_im i thumbs cellen, på den aktuelle position (husk hvilken variabel, som tæller positionen i for løkker)
- Gem middelværdien for RGB værdierne i RGB_val variablen i den rigtige celle, jvnf. ovenstående, brug flg. kommando:
- RGB_val{i} = mean(reshape(res_im, [], 3), 1);
- Opdater waitbaren
- Kald funktionen med to input argumenter; det første er en brøk mellem 0 og 1 (brug det aktuelle index divideret med antallet af filer), det andet er handle-navnet fra tidligere: wb
- Indlæs det aktuelle billede (filer(i).name
- Afslut for løkken
- Gem de skalerede thumbnails (thumbs) og RGB_val i en mat fil:
- Brug en struct struktur til at gemme størrelsen (str), thumbnails (thumbs) og RGB_val
- Syntaksen er som følger:
- tiles.str = str;
- tiles.thumbs = thumbs;
- tiles.RGB_val = RGB_val;
- Brug kommandoen save til at gemme filen
- Første argument er filnavnet - brug stien påklistret underscore, størrelsen og .mat
- Fx: Thumbnails\actors_20.mat
- Hint: Størrelsen skal først konverteres til tekst med kommandoen num2str
- Andet argument er den variabel vi skal gemme (tiles). Den skal angives som tekst, dvs. med omsluttende ''
- Brug en struct struktur til at gemme størrelsen (str), thumbnails (thumbs) og RGB_val
- Luk waitbaren via dens handle.
- Gem funktionen - den skal bruges i en senere øvelse.