Informatica — Universiteit van Amsterdam
Bachelor Informatica
Evaluatie kleurencombinatie in kleding
Simone van Gompel
July 17, 2014
Supervisor(s): Raphael Poss & Roberta Piscitelli
2
Abstract An important aspect of life is making a good impression on other people. This is mostly done by the choice of clothing and the colours of it. A lot of people in the world are colour blind and they can have some problems with deciding the colours in their outfit. So to help people like this and to help people that just don’t know what colours to match, this application is made. In this application you can just upload a picture of yourself and let the program decide for you if the colours of your outfit match or don’t. So if they don’t match you can try on a different combination and upload the new picture to see if this does match. The application works on this basic level, but there is still be a lot to add to it. So if you go shopping and just don’t know if these colours are matching you can just take a picture send it to the application and can see immediately if they match or not.
Contents
1 Inleiding
4
2 Applicatie 2.1 Inhoud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Doelgroep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 5 5
3 Plan van aanpak 3.1 Algemeen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 De hoofddoelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Extra’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 6 6 7
4 Onderzoek 4.1 Kleuren . . . . . . . . . . . . . . 4.1.1 Kleurruimtes . . . . . . . 4.1.2 Kleuren vergelijken . . . . 4.2 Segmentatie . . . . . . . . . . . . 4.2.1 Algemeen . . . . . . . . . 4.2.2 Automatische segmentatie 4.2.3 Interactieve segmentatie . 4.3 Algoritmes . . . . . . . . . . . . 4.3.1 Ruis verwijderen . . . . . 4.3.2 Achtergrond verwijderen . 4.3.3 Kleuren vinden . . . . . . 5 De 5.1 5.2 5.3
. . . . . . . . . . .
8 8 8 11 11 12 12 14 16 16 16 17
algoritmes Verwijder de achtergrond . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vind belangrijke kleuren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Match de kleuren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18 18 18 19
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
6 Implementatie 6.1 Wat is er gedaan . . . . . . . . . . 6.2 Hoe werken de applicaties . . . . . 6.2.1 De Python applicatie . . . . 6.2.2 De website . . . . . . . . . 6.3 Voorbeeld output van de applicatie
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
20 20 20 20 21 24
7 Discussie 7.1 Wat had beter gekund . . . 7.2 Toekomstig werk . . . . . . 7.3 Bereikbaarheid programma 7.4 Wat heb ik ervan geleerd . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
27 27 27 28 28
. . . .
. . . .
. . . .
. . . .
8 Conclusie
29 2
Appendices
30
A Algoritme kleuren vinden
31
B Algoritme Kleuren vergelijken
32
3
CHAPTER 1
Inleiding Een belangrijk aspect van het leven is een goede indruk maken op anderen. Dit wordt o.a. gedaan door de kleding keuze en de kleuren van de kleding. Helaas is dit niet voor iedereen even makkelijk. Zeker 1 op de 12 mannen zijn kleurenblind en daarbovenop ook nog 1 op de 250 vrouwen, dat zijn 700.000 mensen in Nederland alleen al1 . Als je kleurenblind bent kan het combineren van de kleuren in kleding lastig zijn en daarmee ook het maken van een goede eerste indruk. Voor deze mensen is deze applicatie gebouwd die het volgende kan doen: Het bepalen of de kleuren van de kleding in een foto bij elkaar passen of niet. Het idee is dat de gebruiker een foto kan uploaden naar de applicatie, waarna de applicatie zelf de kleuren van de kleding kan selecteren en vergelijken. Dit is bereikt door het toepassen van een aantal algoritmes. In de eerste plaats een algoritme die de achtergrond in een foto kan verwijderen. In de tweede plaats een algoritme die van de overige kleuren kan bepalen of ze bij elkaar passen of niet. Als laatste is het een mogelijkheid dat de applicatie niet alleen teruggeeft welke kleuren niet passen bij de rest, maar dat deze ook aangeeft welke kleur beter gedragen kan worden in combinatie met de rest. Als extra hulp kan in combinatie met het laatste punt ook de namen van de kleuren weergegeven worden. In de rest van deze scriptie worden de volgende punten behandeld: Een uitgebreide uitleg over waar deze applicatie voor dient en voor wie het bedoeld is (niet alleen voor kleurenblinden). Uitleg over de gestelde doelen aan de applicatie. Het onderzoek dat gedaan is naar de componenten van de applicatie. Uitleg over de gebruikte algoritmes. Hoe de implementatie eruit ziet en gebruikt wordt. En als laatste een discussie en conclusie over hoe het gehele project gelopen is.
1 http://mens-en-gezondheid.infonu.nl/ziekten/8493-alles-over-kleurenblindheid.html
4
CHAPTER 2
Applicatie 2.1 Inhoud Deze applicatie kan voor de gebruiker bepalen of de kleuren van zijn of haar kleding in een gegeven foto bij elkaar passen of niet. Een belangrijk aspect van de applicatie is om de gebruiker zo weinig mogelijk te laten doen. De gebruiker moet de foto inladen waar het om gaat en de applicatie moet de rest automatisch kunnen. Een ander belangrijk aspect is het kunnen wegfilteren van de onbelangrijke kleuren. Dit zorgt er namelijk voor dat de kleuren van de kleding over blijven. Het laatste belangrijke aspect is het vergelijken van de overgebleven kleuren, de kleuren van de kleding. Uit het vergelijken moet komen of deze kleuren bij elkaar passen of niet. Eventueel kan er ook meer feedback gegeven worden. Waarom passen deze kleuren niet goed bij elkaar? Welke kleuren kan de gebruiker beter dragen dan de kleuren in de foto? Welke kleuren wel en niet bij elkaar passen moet onderzocht worden.
2.2 Doelgroep De applicatie heeft een redelijk grote doelgroep. In de eerste plaats is deze bedoeld voor kleurenblinden, aangezien zij moeite kunnen hebben met het combineren van kleuren. Maar hier blijft het niet bij, iedereen die een tweede opinie wil over de kleurencombinatie die hij of zij op dit moment aanheeft kan deze applicatie gebruiken voor hulp. Dit maakt dat veel verschillende soorten mensen de applicatie kunnen gaan gebruiken. Als laatste moet nog even worden toegevoegd dat het plan ook is om het mogelijk te maken om nieuwe modules aan de applicatie te hangen. Bijvoorbeeld: een module voor de 70’er jaren. Wat toen normaal en een goede combinatie was is nu misschien niet meer zo. Dus als je naar een 70’er jaren feest wil dan kan dat niet gecheckt worden door de basis applicatie. Maar door een 70’er jaren module te gebruiken in plaats van de standaard kleuren checker wordt dit wel mogelijk gemaakt. Maar modules maken het ook mogelijk dat als mensen niet tevreden zijn met een al bestaande module van de applicatie, dat ze het kunnen herschrijven en opnieuw aan het programma kunnen hangen. Dit zorgt voor veel flexibiliteit. Modules zorgen dus ook voor een verdere verbreding van het publiek en het makkelijker kunnen verbeteren van de applicatie.
5
CHAPTER 3
Plan van aanpak 3.1 Algemeen De applicatie moet de kleuren van kleding in een foto kunnen herkennen en kunnen vergelijken, dit wordt gerealiseerd door de applicatie in de volgende 3 componenten op te delen: • Beeldbewerken, het kunnen vinden van de belangrijke kleuren in een plaatje: – Verwijder de ruis uit de foto. – Verwijder de onbelangrijke kleuren. – Bepaal de belangrijke kleuren. • Kleuren vergelijken, passen de gevonden kleuren goed bij elkaar of niet? • GUI, die de interactie met de gebruiker verzorgt. Er is gekozen om de applicatie in Python te schrijven vanwege het makkelijk kunnen vinden van documentatie over image processing en het kunnen omzetten van RGB waarden naar HSV en HSL waarden. Hieronder worden twee lijsten weergegeven, de eerste wat de hoofddoelen zijn van het project. En de tweede wat als extra doelen gesteld zijn.
3.2 De hoofddoelen Dit zijn de punten waaraan deze applicatie moet voldoen: • Een GUI waarin een foto geupload kan worden en de resultaten weergegeven kunnen worden • De onbelangrijke kleuren moeten verwijderd kunnen worden uit de foto, door middel van gebruiker-input. • De foto moet bewerkt worden om het vorige punt goed mogelijk te maken. • Vind de kleuren die ertoe doen, oftewel de kleuren van de kleding. • Maak een algoritme dat bepaalt of de kleuren bij elkaar passen of niet. • Maak de applicatie bereikbaar voor iedereen, zoals een website.
6
3.3 Extra’s Hier volgen de punten waar de applicatie (nog) niet aan voldoet: • Verwijder de onbelangrijke kleuren automatisch. • Geef de namen van de gevonden kleuren weer als resultaat. • Geef de gebruiker feedback in de vorm van welke kleuren er beter gedragen kan worden. • Zorg voor extra features zoals de gebruiker die modules kan inladen en preferenties kan maken over welke kleuren hij/zij het liefst ziet. • Maak de applicatie zo effici¨ent mogelijk.
7
CHAPTER 4
Onderzoek 4.1 Kleuren Het onderzoek naar kleuren wordt als eerste behandeld, omdat dit in de rest van het onderzoek wordt gebruikt.
4.1.1 Kleurruimtes Er zijn meerdere ”colorspaces” (kleurruimtes) die gebruikt kunnen worden in een computer programma. Een kleurruimte is een manier om kleuren weer te geven in de computer. Er zijn meerdere systemen voor uitgedacht en uitgewerkt, een aantal wordt hieronder uitgelegd[1]:
RGB RGB(Rood, Groen, Blauw) is gebasseerd op de primaire kleuren en wordt in vrijwel elk computer systeem gebruikt. Het is makkelijk te implementeren, maar is niet intu¨ıtief om mee te werken.
Figure 4.1: Mengschema RGB
CMY(K) CMY(K) (Cyan Magenta Yellow (Black)) is een systeem met vier kleuren om gebasseerd op subtractieve kleurmenging1 . Subtractieve kleurmenging is dat je met wit, de kleur van het papier, begint en dat je de gekozen basis kleuren hieroverheen legt. Dit om ervoor te zorgen dat kleuren geabsorbeerd worden en dat je dus een bepaalde kleur ziet. 1 http://nl.wikipedia.org/wiki/Subtractieve_kleurmenging
8
Figure 4.2: Mengschema CYMK
CIELuv, CIELab Deze systemen komen van het Commission Internationale de l’clairage (CIE). Deze zijn gebasseerd op additieve kleurmenging2 . Dit betekent het weergeven van kleuren door de de menging van licht van de drie primaire kleuren (RGB) kleuren. In deze systemen werk je met een driehoek waarbij ieder hoekpunt een primaire kleur heeft. Je kan dan met X, Y, Z co¨ ordinaten elke kleur weergeven. Omdat met x,y,z(genormaliseerde waarden van X,Y,Z) het moeilijk is in te schatten over welke kleur je het hebt wordt het vaak omgerekend naar L*a*b* waarden. L* is de helderheids as a* en b* worden door de gebruiker van dit systeem gekozen hoe ze willen. Bijvoorbeeld kan de gebruiker kiezen voor: a* gaat van (-)groen naar (+)rood en b* gaat van (-)blauw naar (+)geel Figure 4.3: CIELab
Simpel gezegd is het CIELuv systeem een perceptueel uniforme afleiding van het X,Y,Z systeem gebasseerd op hoe mensen kleuren waarnemen.[1]. Figure 4.4: CIELuv
2 http://nl.wikipedia.org/wiki/Additieve_kleurmenging
9
HSL, HSV HSL staat voor Hue Saturation Lightness en HSV staat voor Hue Saturation Value. Door middel van een aantal formules kunnen de normale RGB waarden van pixels omgezet worden in HSL en HSV. In meerdere programmeertalen bestaan al functies die RGB naar HSL en HSV kunnen omzetten. Met HSV is het mogelijk om te kijken of de ene kleur donkerder is dan de ander door te kijken naar de value waarde, namelijk hoe lager de value hoe meer zwart er in de kleur zit. En met de saturation in HSV is het mogelijk te vergelijken of een kleur meer wit in zich heeft dan een andere kleur, hoe lager de saturation hoe meer wit erin voorkomt. Dus om te kunnen kijken of twee kleuren tinten van elkaar zijn kunnen de saturation en value vergeleken worden om een conclusie te kunnen trekken over of ze tinten van elkaar zijn.
De formules om RGB waardes in HSV en HSV waardes om te zetten volgen hieronder: Hierin geld dat het genormalizeerde RGB waardes zijn en dat de maximum en minimum waardes van de RGB triplet bekend zijn. M = max(R, G, B) m = min(R, G, B) C =M −m ( undef ined G−B C mod6 H0 = B−R C +2 R−G C +4
if C = 0 if M = R if M = G if M = B
H = 60◦ × H 0 (genormaliseerd is dit: H =
H 360◦ )
V =M L=
SHSV =
SHSV =
1 (M + m) 2
n 0 C V
if C = 0 otherwise
n 0 C 1−|2L−1|
if C = 0 otherwise
Hierna hoeven alleen deze waardes samengevoegd te worden: HSV = HSHSV V HSL = HSHSL L Voor uitleg zie [1, 2] 10
4.1.2 Kleuren vergelijken Dit is een belangrijk gedeelte van de applicatie. Hoe kan worden gekeken welke kleuren wel en welke niet bij elkaar passen? Het meest belangrijke onderdeel in het kijken of dit zo is, is de kleurencirkel. Het is blijkbaar zo, dat als kleuren op een bepaalde manier ten opzichte van elkaar liggen in de kleuren cirkel, dat ze dan goed bij elkaar passen. Er zijn 3 basis situaties waarin dit zo is. • Complementair:
• Analoog:
• Zelfde tint, andere helderheid/verzadiging:
Hiernaast zijn er nog een aantal aanwijzingen om te weten of de kleuren echt passen. Je hebt namelijk naast de kleuren in de kleurencirkel ook nog wit, grijs en zwart. Deze kunnen niet goed op de kleurencirkel worden afgebeeld, vanwege het feit dat ze niet onder ´e´en hue waarde vallen. Wit, grijs en zwart passen wel in elke combinatie met iedere andere kleur inclusief zichzelf. Als je in je outfit twee keer dezelfde kleur draagt moet de kleur of hetzelfde zijn of een duidelijk andere tint. Er zijn nog veel meer uitzonderingen ten opzichte van kleuren van je kleding, maar in deze scriptie houden we het bij deze punten.
4.2 Segmentatie Zoals eerder gezegd is het belangrijk om de persoon van de achtergrond te kunnen onderscheiden. Een manier om dit voor elkaar te krijgen is segmentatie. Met segmentatie kan je de foto onderverdelen in segmenten/regio’s. Hiermee is het mogelijk om de segmenten van de persoon eruit te vissen en de rest te negeren aangezien het achtergrond is. 11
4.2.1 Algemeen Hier worden kort de algmene segmentatie technieken uitgelegd Er zijn verschillende algoritmes voor zwart wit afbeeldingen en voor kleur afbeeldingen. Dit komt omdat zwart wit afbeeldingen minder informatie bevatten en daarmee met andere technieken te segmenteren zijn. Deze technieken kunnen in principe ook worden gebruikt om kleur afbeeldingen te segmenteren. Dit kan gedaan worden door de techniek op de RGB waarden apart uit te voeren en weer samen te voegen. Het nadeel hiervan is dat je de afhankelijkheid die de RGB waarden van een pixel met elkaar hebben niet wordt meegenomen in de berekening. Dit kan voor inaccurate en niet kloppende resultaten zorgen. In dit project is er van uitgegaan dat de foto’s in kleur genomen zijn, hierdoor is niet verder gekeken naar de zwart wit segmentatie technieken. Twee veel gebruikte methodes in de segmentatie technieken is regio merging en -splitting. Regio merging is een methode waarbij je met een aantal gebieden begint en dat je met een algoritme kijkt welke gebieden in hetzelfde segment horen en daardoor samengevoegd moeten worden. Zodra geen enkel gebied volgens het algoritme meer samengevoegd moet worden met een andere is het segmenteren klaar. Regio splitting is het tegenovergestelde van merging. Je begint met ´e´en groot gebied en deelt deze op totdat elk gebied niet verder opgedeeld hoeft te worden. Segmentatie technieken kan je onderverdelen in de volgende twee klassen: • Automatisch • Interactief Automatisch betekend dat er niet interactief gesegmenteerd wordt. Interactief betekend dat er interactief gesegmenteerd wordt. Het grootste verschil in de output van beide methoden is dat een automatische segmentatie techniek eindigt met homogene gebieden. En een interactieve techniek eindigt met gebieden die volgens de gebruiker belangrijk zijn en gebieden die dat niet zijn. Dit betekend dat voor dit project interactief wenselijker is dan automatisch, evengoed is besloten naar beiden te kijken voor de wetenschappelijke achtergrond ervan.
4.2.2 Automatische segmentatie Fuzzy C-means Fuzzy c-means3 is een segmentatie techniek die vaak wordt gebruikt in combinatie met andere technieken, daarom wordt deze als eerste behandeld. In deze techniek is het algemene idee dat een pixel niet bij maar 1 klasse/segment hoeft te horen, dit betekend dat pixels die op de rand van twee clusters liggen bij beide geclassificeerd kunnen worden. Ieder pixel heeft een waarde die weergeeft hoeveel het bij een bepaald cluster hoort, het gewicht van de pixel bij het cluster. De centroid (gemiddelde) van de clusters en het gewicht van de pixel bij het cluster wordt met de volgende berekeningen gevonden: 1
µij = P l
dij 2/m−1 k=1 dil
Pn µm ij xi cj = Pi=1 n m , ∀j = 1, 2, ...k u i=1 ij n = aantal data punten (pixels) cj = het j’de cluster k = het aantal clusters m = fuzzy index, 1 ≤ m < ∞ µij = gewicht van data punt i in cluster centroid j 3 http://en.wikipedia.org/wiki/Fuzzy_clustering
12
(4.1)
(4.2)
dij = Euclidische afstand tussen data punt i en cluster centroid j Het algoritme gaat als volgt: 1. Bepaal het aantal clusters. (hier komt vaak een andere techniek aan te pas) Of neem een willekeurig aantal clusters. 2. Geef iedere pixel een willekeurig gewicht bij ieder cluster. 3. Herhaal het volgende tot het algoritme het punt heeft bereikt dat het niet nuttig is verder te gaan. (Het algoritme verandert de uitkomst (bijna) niet meer) (a) Bereken de centroid van ieder cluster. (b) Bereken het gewicht van ieder pixel bij ieder cluster. Na dit algoritme eindig je met een geclusterde foto, oftewel je hebt de segmenten gevonden.
HTFCM Deze afkorting staat voor Histogram Thresholding Fuzzy C-Means segmentatie[10]. Het maakt gebruik van de fuzzy c-means techniek. Voor het bepalen van de hoeveelheid begin clusters wordt er gebruik gemaakt van histogrammen. In de eerste plaats wordt van de foto van de rood, groen en blauw waarden apart een histogram gemaakt. Dit histogram bestaat uit het aantal pixels tegen de intensiteit afgezet. De pieken in deze histogrammen worden gepakt om te kunnen bepalen hoeveel clusters er zijn.
Figure 4.5: Met x is de intensiteit van de gevonden pieken aangegeven
13
Er wordt vervolgens in de foto gekeken welke gebieden het beste bij welke piek horen en worden samen gevoegd in een cluster. Zodra het aantal clusters bekend is kan FCM plaatsvinden. Zie 4.2.2.
AFHA Een ander algoritme dat een beter resultaat boekt dan de vorige is AFHA[13]. Dit algoritme kijkt eerst naar welke clusters er in de foto voorkomen door middel van een ant colony optimization. Ant colony optimization in het kort: In dit geval zijn de mieren (ants) de pixels in de foto. Het begint met dat iedere pixel een cluster is. De mieren gaan in het algoritme kijken welk cluster het best bij ze past. Dit doen ze door te kijken welk cluster het dichtsbijzijnde en het aantrekkelijkst is. De clusters beginnen met geen feromonen, maar hoe meer mieren naar het cluster toegaat hoe meer feromonen er achter worden gelaten. Deze feromonen bepalen hoe aantrekkelijk een cluster is. Dit betekend hoe meer feromonen hoe meer mieren ernaar toegaan. In het AFHA algoritme gebruiken ze een aangepaste versie (advanced ant colony optimization). Hierin wordt er begonnen met al een aantal clusters. Verder negeren de mieren alle clusters die te ver weg liggen. Deze aanpassingen zijn gemaakt om de berekeningen die gemaakt moeten worden wat lichter te maken. Het AFHA algoritme is als volgt: 1. Laad de foto in als 3D dataset, met als dimensies de RGB waarden. 2. Bepaal de cluster centroids en aantal d.m.v. pixel kleuren statistieken.([13] pagina 1892) 3. Bereken de cluster center set en aantal gebruik makend van advanced ant colony optimization. 4. Cluster met behulp van Fuzzy c-means. Zie 4.2.2 Detecting human faces Er is ook een algoritme bedacht waarbij gezichten uit een foto gevonden kunnen worden met behulp van segmenteren. Dit is belangrijk, omdat in de applicatie het ook mogelijk is aan de hand van de plaatsing van het gezicht te bepalen waar de kleding is en daarmee de kleuren hiervan te vinden. Zodra namelijk bekend is waar het gezicht zich bevindt kan beredeneerd worden dat het lichaam zich recht onder het gezicht bevindt en daarmee ook de kleding. Eerst word er een multiscale transform gedaan waarbij homogene clusters gevonden kunnen worden[7]. Hierna wordt naar elk van deze clusters gekeken en vergeleken met een Guassian functie waarin alle huidskleuren zouden zitten. Deze Guassian is gemaakt met behulp van het CIELuv systeem. Zodra dit gedaan is moet nog alleen het gezicht gevonden worden en niet ook de armen etc. Dit wordt gedaan door te kijken naar deze clusters en te kijken welke van deze ellips-vormig zijn. Als ze ellips-vormig zijn is het hoogstwaarschijnlijk een gezicht.
4.2.3 Interactieve segmentatie Seeded region growing Dit is een snel en simpel voorbeeld van een interactief algoritme, maar heeft wel beperkingen vanwege deze eenvoud. Deze wordt enkel behandeld omdat er overwogen is deze te implementeren vanwege de eenvoud[14]. De gebruiker hoeft enkel twee punten aan te geven, ´e´en in de voorgrond en ´e´en in de achtergrond. Het algoritme gaat vervolgens naar iedere buurpixel kijken en bepalen of zijn kleur het best bij de gemiddelde kleur van de voor- of achtergrond hoort. De pixel wordt ingedeeld bij degene waarvan de kleur het meest overeenkomt.
14
Region based segmentation Eerder is kort uitgelegd wat region merging is. Het algoritme beschreven in [16] maakt hier gebruik van. Het begint met gebieden maken gebasseerd op de kleur en de Euclidische afstand. Je begint met dat elke pixel apart een cluster is en gaat die vergelijken met de clusters in de buurt Twee clusters worden samengevoegd als de kleur en Euclidische afstand dicht genoeg bij elkaar liggen. Zodra het aantal clusters onder een bepaalde waarde zakt worden andere technieken gebruikt om ze te mergen. Op dit punt is ieder cluster opgeslagen als een gemiddelde kleur en grootte van het cluster, wat ervoor zorgt dat er minder opslagcapaciteit nodig is. Hierna worden de volgende methoden toegepast: • Boundary merging, dit betekent dat als twee clusters een grens hebben die langzaam overgaat (een wazige grens) dat deze clusters samengevoegd worden. • Regularity, hierbij wordt gekeken naar de complexiteit van een voorwerp. Vaak is de complexiteit niet groot, dus er wordt gekeken naar hoe complex het cluster is als er twee samengevoegd worden. Is dit te groot dan worden ze niet samengevoegd, is het nog laag dan wel. • Inclusion, dit betekent dat er een klein cluster volledig in een grotere zit en aan geen enkel ander cluster grenst. Vaak kan je dan deze clusters mergen. Zodra dit allemaal gedaan is heb je alleen nog maar basis clusters over. Dit is niet interactief, maar wordt door [14] gebruikt om een interactief algoritme ervan te maken. Dit doen ze door middel van een boom te maken met de gevonden clusters. Met als bladeren alle pixels en als wortel het gehele plaatje. De gebruiker kan dan aangeven wat voorgrond en wat achtergrond is en dan wordt iedere knoop afgelopen en als ´e´en van de twee clusters gemarkeerd. Je begint in de bladeren en markeert iedere knoop vanaf daar als hetzelfde als de ouder. Zodra er een conflict is wordt de knoop niet gemarkeerd en zijn ouder wordt als tegenstrijdig gemarkeerd. Hierna wordt iedere niet tegenstrijdige knoop opgezocht en zijn niet gemarkeerde kinderen als hetzelfde gemarkeerd als deze knoop. Als er hierna nog steeds niet gemarkeerde knopen zijn dan worden deze gemarkeerd naar de dichtsbijzijnde knoop. Hierna is iedere pixel gemarkeerd als deel van een cluster.
SIOX SIOX wordt o.a. gebruikt door het programma GIMP[8]. Het idee hierachter is dat de gebruiker met behulp van rechthoeken aan kan geven welke gedeeltes van de foto het voorwerp zijn. En ook wat het interessante gebied is (waar het voorwerp wat je wilt hebben volledig invalt) Ieder ander gebied is achtergrond. Figure 4.6: De groene rechtoeken zijn onderdeel van het voorwerp en de rode rechthoek is het interessante gebied
15
Als eerste stap na de gebruikers-input wordt de colour space van de foto omgezet in de CIELab kleur ruimte.[12] Wanneer dit gedaan is wordt er segmentatie uitgevoerd op de foto. Ze maken een ”colour signature” van de achtergrond en gaan voor ieder pixel na of deze dezelfde signatuur heeft of niet. De bekende achtergrond wordt geclusterd in even grootte clusters. Deze clusters worden vervolgens verwerkt met een twee stage k-d boom algoritme. Zodra het algoritme klaar is heb je een k-d boom met de clusters met de bekende achtergrond. Als je nu een onbekende pixel hebt kan je de boom doorlopen om te kijken of het bij de achtergrond hoort. Het is ook mogelijk dezelfde boom op te zetten voor de bekende voorgrond. Mocht een pixel bij geen van beide bomen horen dan kijk je bij welke van de twee de pixel het dichtstbij staat. Nu is het voorwerp bijna uit de foto gehaald. Het enige dat nog gedaan moet worden is post processing. Dit om de kleuren van de achtergrond die ook in de voorgrond zijn gekomen weg te halen. Dit wordt gedaan door te kijken naar de grootst mogelijke regio in de voorgrond en eigenlijk alles wat er niet aan vastzit weg te knippen. De gebruiker kan nog wel specificeren hoeveel er vervaagd wordt. Minder vervaging is beter voor plaatjes waarbij niet alles evengoed aansluit op het hoofdobject. Bijvoorbeeld met menselijk haar sluit het niet allemaal mooi aan en wordt er misschien wat van weggefilterd als je teveel vervaagt.
4.3 Algoritmes Het belangrijkste doel van het beeldbewerken in deze applicatie is het kunnen bepalen van de belangrijke kleuren in de foto. Er is gekozen om dit te bereiken door eerst de ruis uit de foto te verwijderen, waarna de onbelangrijke (achtergrond) kleuren uit de foto verwijderd kunnen worden. Dit is zodat er alleen nog maar belangrijke kleuren in de foto achter blijven, wat zeer handig is om te bepalen welke kleuren van de outfit zijn. De algoritmes worden hier kort beschreven.
4.3.1 Ruis verwijderen Het eerste dat gebeurt, is het bewerken van de foto. De foto wordt gedenoised, dit betekent dat de ruis uit de foto wordt gehaald. In dit geval wordt niet alleen de ruis eruit gehaald, maar wordt de foto extra vervaagd. Er is gekozen om dit te doen door middel van total variation denoising4 . Deze manier zorgt er namelijk voor dat de overgangen in de foto scherp blijven tijdens het vervagen. In tegenstelling tot bijvoorbeeld Gaussian denoising waarbij ook de overgangen vervaagd worden. Dit is belangrijk zodat de lijnen die de mens scheidt van de achtergrond behouden worden. Hierdoor kan de achtergrond verwijderd worden zonder dat er ook pixels van de kleding verdwijnen. De gedenoisde versie van de foto wordt alleen gebruikt bij het verwijderen van de achtergrond. Hierna wordt weer de orginele foto gebruikt, maar dan wel zonder de pixels die eruit zijn gefilterd in de vorige stap. Dit zodat de details in de kleding later nog wel zichtbaar zijn en met elkaar vergeleken kunnen worden in de stappen waarin de belangrijke kleuren worden bepaald en vergeleken.
4.3.2 Achtergrond verwijderen De achtergrond verwijderen is een belangrijk punt. Dit kan op vele manieren bereikt worden. Er kan gekozen worden om dit wel of niet interactief te doen. Het is misschien zelfs het beste dit wel te doen, omdat er dan minder fouten gemaakt kunnen worden dan wanneer het automatisch gebeurt. De gebruiker weet namelijk beter dan de computer waar hij/zij zich in de foto bevindt en dus wat de belangrijke en onbelangrijke kleuren zijn. Als er gekozen is om het interactief te doen dan moet de gebruiker op de een of andere manier aangeven welke kleuren de achtergrond zijn. Dit kan door middel van klikken op de achtergrond kleuren die uit de foto verwijderd moeten worden. Een andere manier om aan gebruiker-input te komen is als volgt:5 De gebruiker kan met een rode lijn aangeven welk gedeelte de achtergrond 4 http://scikit-image.org/docs/dev/auto_examples/plot_denoise.html 5 https://clippingmagic.com/
16
is en met een groene lijn welk gedeelte de voorgrond is. De kleuren die onder de rode lijn vallen maar niet onder de groene lijn worden verwijderd uit de foto en deze wordt weergegeven aan de gebruiker. Als de gebruiker niet tevreden is met het resultaat is het mogelijk om meer lijnen aan te brengen en op die manier wel het gewenste resultaat te krijgen. Als het niet interactief gedaan wordt zijn er verschillende manieren te bedenken om de onbelangrijke kleuren te verwijderen. De meest voor de hand liggende is de kleuren in de hoekpunten te pakken en deze geheel uit de foto te verwijderen. In deze applicatie zal het namelijk niet voorkomen dat als iemand zijn/haar gehele outfit op een foto wilt hebben de outfit in een van de hoekpunten te zien is. Het is echter wel zo dat als de achtergrond dezelfde kleur heeft als een gedeelte van de outfit het kan gebeuren dat de outfit dan ook verwijderd wordt. Het kan ook bereikt worden met behulp van segmenteren. Zie sectie 4.2.
4.3.3 Kleuren vinden Het vinden van de juiste kleuren uit de foto zonder de achtergrond, wordt gedaan door de hue waardes te berekenen van de pixels die overgebleven zijn. Er wordt een histogram gemaakt waar de hue waardes tegen het aantal pixels worden afgezet. Vanuit dit histogram is het mogelijk te zien welke kleuren veel voorkomen en welke helemaal niet. En kunnen de kleuren vergeleken worden. Het enige probleem hiervan zijn alle waarden van wit, grijs en zwart. Deze kunnen namelijk onder alle hue waarden verdeeld worden. Zie 4.1.1. Hierdoor is het onmogelijk om met alleen de hue waarde van de pixel wit, grijs en zwart in een ander hokje op te delen dan alle andere kleuren. Dit zorgt er dan voor dat als het wit onder rood onderverdeeld wordt er meer rood lijkt te zijn dan er daadwerkelijk is en het rood dat er is witter wordt gemaakt. Wat er gedaan wordt om dit te voorkomen is al deze waarden in een aparte waarde op te slaan. Onder deze waarde worden de pixels die wit, grijs of zwart zijn opgeslagen. Dit zorgt ervoor dat deze waarden apart behandeld kunnen worden en apart bekeken kunnen worden in het histogram. Van al deze hue waarden wordt een histogram gemaakt waaruit afgelezen kan worden welke kleuren het belangrijkst zijn en welke minder belangrijk. Aangezien de kleur die het meest voorkomt ook het meest overheerst is het belangrijker dat deze bij alle andere kleuren hoort dan dat eentje die bijna niet voorkomt. Hier kan nog wel een uitbreiding voor gemaakt worden voor accesoires. Deze nemen niet veel pixels in beslag, maar zijn even belangrijk als een kledingstuk.
17
CHAPTER 5
De algoritmes 5.1 Verwijder de achtergrond Twee van de eerder genoemde algoritmes zijn ge¨ımplementeerd. In de eerste plaats worden de kleuren van de vier hoekpunten in de foto verwijderd. Dit wordt als volgt gedaan: De foto wordt aan het algoritme meegegeven. De ruis wordt eruit gefilterd door middel van total variation denoising. Dit is een functie in de python library scikit-image1 . Het algoritme zoekt vervolgens de RGB waarden van de vier hoekpunten op en slaat deze op. Ieder pixel in de foto zonder ruis wordt vergeleken met ieder van de vier gevonden kleuren (hoekpunt kleuren). Zodra de waarde van de pixel in de buurt valt van ´e´en van de hoekpunt kleuren wordt deze uit de foto verwijderd. Dit vergelijken gebeurd als volgt: Er wordt gekeken of de pixel een echte kleur is of grijs, wit of zwart. Zodra het namelijk grijs, wit of zwart is zal er gekeken worden of de RGB waarden van de pixel in een bepaalde range van de RGB waarden van de hoekpunt kleur valt. Maar als het een echte kleur is (alles behalve wit, grijs en zwart) dan wordt gekeken of de hue waarde van de pixel in een range valt van de hue waarde van de hoekpunt kleur. Als blijkt dat het een kleur is die verwijderd moet worden krijgt deze pixel de waarde [-1,-1,-1]. en wordt als zwart weergegeven op het scherm. Dit algoritme kan gezien worden als een regio splitting segmentatie techniek. Waarbij het gebied zo klein kan zijn als ´e´en pixel. De eerder besproken range is met trial en error besloten. Na het filteren van de ruis in de foto vallen de RGB waarden in een range van 0-1 en de hue waarde is ook in een range van 0-1. Het blijkt dat de range om te checken of de RGB in de buurt valt het best is op 0.1 en de range van de hue waarde op 0.2. Als na het uitvoeren van deze methode de gebruiker niet tevreden is en op de retry knop drukt, krijgt de gebruiker de kans om zelf aan te geven welke kleuren er verwijderd worden. Zodra de gebruiker op de foto een punt aanklikt wordt de kleur van dit punt bepaald en opgeslagen. Deze wordt meegegeven aan het algoritme dat deze kleur weg zal halen uit de foto. Het weghalen van de kleur gebeurt op dezelfde manier als bij de vorige is uitgelegd, het enige verschil is dat er niet met vier kleuren vergeleken wordt, maar met maar ´e´en kleur.
5.2 Vind belangrijke kleuren Dit algoritme is niet al te lastig. De foto zonder de onbelangrijke kleuren wordt hiervoor gebruikt. Het principe is dat er een histogram wordt gemaakt van het aantal pixels dat een bepaalde hue waarde heeft. Hiernaast wordt ook de RGB waarde van dezelfde hue gemiddeld over alle pixels die deze hue waarde hebben. Dit om later te kunnen weergeven welke kleur bij deze hue hoort en om te kunnen checken of de kleuren bij elkaar passen of niet. Ieder pixel in de foto wordt nagegaan en gekeken of het wit, grijs of zwart is en of het een echte kleur is. Blijkt het wit, grijs of 1 http://scikit-image.org/
18
zwart te zijn dan wordt deze pixel toegevoegd aan een aparte sectie van het histogram, namelijk hue waarde 13 (´e´en hoger dan waar mee wordt gewerkt). Er wordt gewerkt met 12 hue waardes. Hiervoor is gekozen, omdat een bepaalde kleurencirkel ook met 12 hue waardes werkt en het daarmee makkelijker maakt om tests te maken die kijken of het algoritme voor het vergelijken van de kleuren klopt of niet. Als het een kleur blijkt te zijn wordt de hue ervan berekend en deze wordt vermenigvuldigd met 12, zodat deze toegevoegd kan worden in het histogram onder deze bepaalde hue. In de lijst waarbij het aantal pixels voor een bepaalde hue wordt bijgehouden wordt er enkel ´e´en bij opgeteld. En in de lijst waarbij de RGB waarde wordt bijgehouden wordt simpel deze RGB erbij opgeteld. Helemaal aan het eind wordt de RGB gedeeld door het aantal gevonden pixels zodat de gemiddelde RGB weergegeven kan worden aan de gebruiker en gebruikt kan worden voor het vergelijken van de kleuren. Zie appendix A voor het algoritme.
5.3 Match de kleuren Dit algoritme is de belangrijkste van alle, dit omdat de applicatie draait om het bepalen van het vergelijken van kleuren. De verschillende manieren om te vergelijken is al eerder uitgelegd. Hoe gematcht wordt is wel belangrijk, er kan namelijk gekozen worden tussen: zodra een kleur bij ´e´en andere kleur past is het een match, zodra de kleur bij elke andere kleur past is het een match. In het eerste geval vind je dat een kleur in je kleding matcht zodra je ook een andere kleur draagt die met die matcht In het tweede geval vind je dat een kleur in je kleding matcht zodra het een match is met iedere andere kleur in je kleding. Ik heb gekozen voor de tweede methode, aangezien je kleding een geheel moet zijn en dus de kleuren van je kleding allemaal bij elkaar moeten passen. Maar er zou altijd nog een module gemaakt kunnen worden die de eerste situatie implementeert. Deze methode is als volgt ge¨ımplementeerd. Iedere gevonden RGB waarde wordt vergeleken met iedere andere gevonden RGB waarde behalve zichzelf. Deze twee worden vergeleken door te kijken of het een wit, grijs of zwart kleur is. Zodra dat het geval is matcht het altijd, dus wordt het niet toegevoegd aan de no match lijst. Als het een echte kleur is, wordt gekeken welke HSV waardes de twee kleuren hebben en worden de volgende situaties getest: Zijn ze complement aan elkaar, wordt gedaan door te kijken of het verschil in de hues 0.5 is. Dit aangezien de hues worden weergegeven van 0-1 en de helft hiervan 0.5 is. En als dan de twee hues een verschil van 0.5 hebben betekend het dat ze tegenover elkaar op de kleurencirkel liggen. Zijn ze analoog van elkaar, wordt gedaan door te kijken of het verschil in de hues minder dan 0.1 is. Zijn ze tinten van elkaar, wordt gedaan door te kijken of ze in dezelfde hue vallen (verschil van minder dan 0.01) en of hun saturation of hun value niet hetzelfde zijn. Het verschil tussen de hues wordt als volgt berekend: is hue − hue2 < 0, dan is het verschil hue − hue2 + 1 anders is het verschil gewoon hue − hue2 Dit om ervoor te zorgen dat er de waarde altijd tussen de 0 en de 1 valt. Zie appendix B voor het algoritme.
19
CHAPTER 6
Implementatie 6.1 Wat is er gedaan Er is gekozen om uiteindelijk twee versies van de applicatie te maken. De eerste is de applicatie die aan alle hoofddoelen voldoet. Deze is in Python geschreven. De tweede is een applicatie die naast de hoofddoelen beter bereikbaar is voor de gebruiker. En daarbovenop op zo een manier gemaakt is dat het makkelijk is om modules hiervoor te maken. Hier volgt een lijst van features die zijn verwerkt in de eerste applicatie: • Uploaden foto • Automatisch verwijderen achtergrond • Als de achtergrond niet goed verwijderd is, verwijderen hiervan met user input • Bepalen belangrijke kleuren • Kleuren vergelijken • Resultaten weergeven aan de gebruiker Deze zijn ook ge¨ımplementeerd in de tweede applicatie: • Bereikbaarheid is groot • Modules kunnen maken voor deze applicatie
6.2 Hoe werken de applicaties 6.2.1 De Python applicatie Implementatie De applicatie bestaat uit 3 gedeeltes. • Evaluatie kleding (met GUI) • Beeld bewerken • Kleuren vergelijken Er wordt de gebruiker gevraagd om het pad naar de foto op te geven. Er wordt gekeken of dit een geldig pad is en of het echt een plaatje is. Zodra dit klopt, wordt de foto echt ingeladen. Deze foto wordt meegegeven aan de functie ”denoise img” in ”Beeldbewerken”. Deze functie filtert de ruis eruit en stuurt de bewerkte foto terug. Het hoofdprogramma roept de functie 20
”remove corner colors” in ”Beeldbwerken” aan. Deze zorgt voor het automatisch verwijderen van de achtergrond en stuurt de foto zonder de achtergrond terug. Deze foto wordt weergegeven aan de gebruiker via de GUI (gemaakt met Tkinter). Het hoofdprogramma roept hierna de functie ”determine important colors” in ”Kleuren vergelijken” aan. Deze bepaalt welke kleuren er zich nog in de foto bevinden. Het resultaat hiervan wordt weer terug gestuurd. Dit resultaat wordt weergegeven aan de gebruiker via de GUI. Als laatste wordt de functie ”check colors” in ”Kleuren vergelijken” aangeroepen. Deze bepaalt welke gevonden kleuren wel en welke niet bij elkaar passen. Dit resultaat wordt terug gestuurd en weergegeven aan de gebruiker via de GUI. Als er op de foto gedrukt wordt door de gebruiker wordt de functie ”remove color” in ”Beeld bewerken” aangeroepen met de bijbehorende kleur. Deze verwijdert die kleur uit de foto en stuurt het resultaat terug. Daarna worden de functies ”determine important colors” en ”check colors” aangeroepen om het resultaat te bepalen. Dit wordt samen met de nieuwe foto weergegeven aan de gebruiker via de GUI. Als de gebruiker op de retry knop drukt worden alle opgeslagen gegevens verwijderd behalve de orginele foto. De resultaten worden van de GUI afgehaald. Als de gebruiker op de quit knop drukt wordt het hele programma afgesloten. Gebruiksaanwijzing De Python applicatie wordt als volgt gebruikt: Je downloadt de Python code die bij deze applicatie hoort. Je gaat in een command prompt naar de bijbehorende map en tikt het volgende in: Python outfit evaluation.py Hierna wordt er gevraagd om het pad naar de foto in te tikken. Zodra dit gedaan is wordt de daadwerkelijke applicatie opgestart. In de applicatie zie je links de foto die je ingeladen hebt. Rechts hiervan zie je de foto met de automatisch verwijderde achtergrond. Helemaal rechts zie je een lijst met de gevonden kleuren in de fotot. Onderaan vind je een tabel met de resultaten van het programma. In deze tabel is te vinden welke kleuren goed met elkaar combineren en welke niet. Als je als gebruiker het er niet mee eens bent hoe de achtergrond verwijderd is dan is er een retry knop die je in kan klikken. Waarna de automatisch verwijderde achtergrond ongedaan wordt gemaakt en je als gebruiker zelf op punten in de foto kan drukken waarvan de bijbehorende kleuren als achtergrond worden bestempeld. Als je klaar bent met het programma druk je op de quit knop die ervoor zorgt dat het programma afsluit.
6.2.2 De website Implementatie De applicatie bestaat uit 4 gedeeltes. • Website • Server – Beeld bewerken – Kleuren vergelijken Op de website wordt er een foto geupload. De url naar deze wordt naar de server doorgestuurd. De server laadt de foto in en stuurt deze naar de functie ”denoise img” in ”Beeldbewerken”. Deze functie filtert de ruis eruit en stuurt de bewerkte foto terug. De server roept de functie ”remove corner colors” in ”Beeldbwerken” aan. Deze zorgt voor het automatisch verwijderen van de achtergrond en stuurt de foto zonder de achtergrond terug. Deze foto wordt geupload naar 21
de website. De server roept hierna de functie ”determine important colors” in ”Kleuren vergelijken” aan. Deze bepaalt welke kleuren er zich nog in de foto bevinden. Het resultaat hiervan wordt weer terug gestuurd. Als laatste wordt de functie ”check colors” in ”Kleuren vergelijken” aangeroepen. Deze bepaalt welke gevonden kleuren wel en welke niet bij elkaar passen. Dit resultaat wordt naar de website gestuurd die dit aan de gebruiker weergeeft. Als er op de foto gedrukt wordt door de gebruiker wordt de RGB waarde hiervan naar de server gestuurd. Deze roept de functie ”remove color” in ”Beeld bewerken” aan met de gestuurde kleur. Het resultaat hiervan wordt geupload naar de website Daarna worden de functies ”determine important colors” en ”check colors” aangeroepen om het resultaat te bepalen. Deze worden naar de website gestuurd die deze weergeeft samen met de nieuwe bewerkte foto. Als de gebruiker op de retry knop drukt wordt dit naar de server gestuurd die alle bewaarde gegevens verwijderd op de orginele foto na. Gebruiksaanwijzing De website wordt als volgt gebruikt: Je downloadt de Python code die bij deze applicatie hoort. Je gaat in een command prompt naar de bijbehorende map en tikt het volgende in: Python server.py Hierna kan de gebruiker naar de website toe. Op de website wordt eerst gevraagd een foto te uploade. Zodra dit gedaan is wordt je doorgestuurd naar een pagina met de resultaten. Op deze pagina zie je bovenaan een bericht dat de foto goed of juist niet goed ge¨ upload is. Daaronder worden berichten weergegeven aan de gebruiker waar het programma mee bezig is. Hieronder komen uiteindelijk de resultaten terecht. Daar direct rechts van is de orginele foto te zien en helemaal rechts de foto zonder de achtergrond. De gebruiker kan op ieder moment een kleur in de foto aanklikken, deze wordt dan verwijderd. Als je als gebruiker het er niet mee eens bent hoe de achtergrond verwijderd is dan is er een retry knop die je in kan klikken. Waarna de automatisch verwijderde achtergrond ongedaan wordt gemaakt en je als gebruiker zelf op punten in de foto kan drukken waarvan de bijbehorende kleuren als achtergrond worden bestempeld. e
22
Hier volgt een schematische weergave van de connecties van de website naar de server.
23
6.3 Voorbeeld output van de applicatie Hier volgt een afbeelding van de output van het programma met uitleg erbij wat er weergegeven word.
24
Dit is een afbeelding waarbij het automatisch verwijderen van de achtergrond goed gelopen is evenals het vinden en vergelijken van de kleuren.
Hier is de achtergrond niet goed verwijderd, omdat de kleur van de achtergrond en de kleur van het shirt te veel op elkaar lijken.
Hier is de achtergrond niet goed verwijderd, omdat de kleur van de achtergrond en de kleur van de tas en jas te veel op elkaar lijken.
25
Dit is een voorbeeld van proeven die gedaan zijn om te kijken of het vergelijken van de kleuren goed bij elkaar passen of niet.
Dit is een voorbeeld met een perfecte kleur achtergrond.
26
CHAPTER 7
Discussie Voor de genoemde doelgroep is nu een werkend prototype gemaakt. Deze kan met behulp van een opdrachtprompt aangeroepen worden en kan je gebruiken voor het evalueren van de kleurencombinatie in kleding. De beschreven algoritmes zijn in python ge¨ımplementeerd en werken naar behoren. Het programma geeft duidelijk weer welke kleuren niet goed met de rest combineren en welke kleuren wel goed combineren.
7.1 Wat had beter gekund Er is een aantal punten waardoor het maken van de applicatie niet zo ging als gepland. Onder andere was Python langzamer dan verwacht met het verwerken en bewerken van de foto. Dit zorgde voor een langzamere applicatie dan gebruiksvriendelijk is. Het ligt er tevens ook aan waarop de applicatie gebruikt wordt. Op een netbook (Intel Atom processor, 2GB RAM) waarop het getest is duurde het 25 seconden om de applicatie te uit te voeren, dus het scherm te krijgen met alle automatische waardes. Daarnaast duurde het ook 5 seconden voordat gebruiker-input in de vorm van het verwijderen van een aangegeven kleur verwerkt is. Maar als dezelfde applicatie op mijn thuis computer (Intel i3 processor, 4GB RAM) gedraaid wordt duurt het eerste gedeelte maar 3 seconden en het verwerken van de gebruiker-input zo danig snel dat het timen ervan niet belangrijk is.
7.2 Toekomstig werk Op dit moment is alles nog in Python, het zou sneller en effici¨enter kunnen als het omgeschreven wordt naar een andere taal. Het Kleuren vergelijken werkt op het moment met 5 cases, complementair, analoog, tinten, wit/grijs/zwart past bij alles en als er twee keer ongeveer dezelfde kleur voorkomt in een outfit moet het of echt hetzelfde zijn of echt anders. Maar er zijn nog meer mogelijkheden om dit te verbeteren, zoals zwart en bruin passen niet goed bij elkaar. Hiervoor moet nog meer onderzoek worden gedaan naar het kleuren vergelijken. Verder moet er nog gewerkt worden aan het feit dat de gebruiker kan aangeven in de lijst met gevonden kleuren welke kleuren er genegeerd moeten worden. Naast deze punten had het ook mooi geweest als een klein gedeelte van de feedback al af was. Het is namelijk lastig voor de gebruiker als ze alleen te horen krijgen welke kleuren niet bij elkaar passen, in plaats van te horen waarom niet. Als de gebruiker ook weet waarom, kan diegene ervan leren en heeft hij/zij later misschien minder het programma nodig. Dit is echter opgeschoven tot toekomstig werk vanwege tijdsgebrek. Er is ook nog geen feedback ge¨ımplementeerd in de zin van het weergeven van namen van de kleuren[5] en welke kleuren er dan beter gedragen kunnen worden. 27
7.3 Bereikbaarheid programma Het programma is te vinden op https://github.com/Simonevg/AfstudeerProject. Dit is een private repository op git, dit aangezien het plan is er nog verder aan te werken. De huidige applicatie wordt naar de branch op github gepusht die development heet en de master branch bevat de laatst goed werkende versie van de applicatie. Deze versie staat tevens ook op mijn computer mocht er vanwege de een of andere reden iets fout zijn gegaan met het pushen. De github wordt pas publiek gemaakt zodra de applicatie naar mijn mening af is. Dat betekent dat de applicatie de extra features heeft waar ik nog aan wil werken, de website goed werkt en er een backup is gemaakt op mijn computer. Mocht iemand eerder toegang willen tot de applicatie, graag een mailtje sturen naar
[email protected].
7.4 Wat heb ik ervan geleerd Ondanks dat Python een redelijk goede programmeertaal is zal het niet snel meer de eerste keuze zijn als er aan beeldbewerking gedaan moet worden. Daar is het te langzaam voor. Python is een prima taal om een prototype mee te maken, maar niet goed voor echte producten vanwege de snelheid. Verder zal er volgende keer tijdens het vooronderzoek meer nagedacht moeten worden over de uiteindelijke applicatie. Dus niet alleen naar de hoofddoelen kijken, maar ook naar de extra doelen en daar alvast wat tijd aan besteden. Dan zou nu misschien wat meer van de extra doelen ge¨ımplementeerd zijn. Als laatste punt: kijk beter naar de documentatie van functies, zodat in ieder geval duidelijk is hoe ze te gebruiken zijn. Het is namelijk altijd wel te vinden en dat scheelt tijd en moeite tijdens het programmeren.
28
CHAPTER 8
Conclusie Het idee van deze applicatie was om mensen die het lastig hebben met het kunnen zien van kleuren of het maken van kleurencombinaties te helpen. Dit zou gedaan worden door een applicatie te maken waarin een foto geupload kan worden waarin de kleuren van je outfit met elkaar vergeleken zouden worden en teruggegeven zou worden of deze bij elkaar passen of niet. Er is voldaan aan de minimale eisen die gesteld zijn, namelijk het kunnen uploaden van een foto naar de applicatie, een gui die de resultaten kan weergeven, het kunnen verwijderen van onbelangrijke kleuren en het bepalen van belangrijke kleuren. Tot slot is het mogelijk dat de belangrijke kleuren vergeleken worden en gekeken word of ze bij elkaar passen of niet. Dit is allemaal verwerkt in een prototype geschreven in python. Van de extra doelen is de volgende ook gehaald, het automatisch kunnen verwijderen van de achtergrond. Er zijn nog mogelijkheden het programma uit te breiden. Het verbeteren van de kleuren vergelijken, het verbeteren van de algoritmes, het weergeven van de namen van kleuren en de feedback van het kleuren vergelijken.
29
Appendices
30
APPENDIX A
Algoritme kleuren vinden
Algorithm A.0.1 Algoritme kleuren vinden for all pixel in photo do if pixel not [-1,-1,-1] then hue, sat, value = HSV(pixel) if pixel = white, gray, black then hue hist[13]++ save RGB[13][0] += pixel[0] // R value pixel save RGB[13][1] += pixel[1] // G value pixel save RGB[13][2] += pixel[2] // B value pixel else hue hist[hue*12]++ save RGB[hue*12][0] += pixel[0] // R value pixel save RGB[hue*12][1] += pixel[1] // G value pixel save RGB[hue*12][2] += pixel[2] // B value pixel end if end if end for for all index in len(save RGB) do save RGB[index][0] = save RGB[index][0]/hue hist[index][0] save RGB[index][1] = save RGB[index][1]/hue hist[index][1] save RGB[index][2] = save RGB[index][2]/hue hist[index][2] end for
31
APPENDIX B
Algoritme Kleuren vergelijken
Algorithm B.0.2 Algoritme Kleuren vergelijken for all RGB in RGBList do hue, sat, val = HSV(RGB) for all RGB2 in RGBList(except RGB) do hue2, sat2, val2 = HSV(RGB2) if hue==hue2 then if value not value2 or sat not sat2 then // same hue but other tint match HSV and HSV2 match break; end if else if diff(hue, hue2) < 0.5 then complements match HSV and HSV2 match break; else if hue == hue2+0.1 or hue == hue2-0.1 then // if they are next to each other on the colour circle they match HSV and HSV2 match break; end if end for if not match found then value doesn’t match anything no match append (RGB, RGB2) end if end for
32
Bibliography [1] Adrian Ford & Alan Roberts, Colour Space Conversions, August 11, 1998. [2] http://en.wikipedia.org/wiki/HSL_and_HSV [3] Lexi Sheehy, http://www.collegefashion.net/fashion-tips/ a-foolproof-guide-to-matching-colours-in-your-outfits/ Penn State University. [4] http://www.sostylist.com/index.php/colourmatchingadviceforclothing [5] https://pypi.Python.org/pypi/webcolours/1.4 [6] Fredrik Lundh & Matthew Ellis, Python Imaging Library Overview, March 12, 2002, PIL 1.1.3 [7] Mig-Hsuan Yang, Narenda Ahuja, Detecting Human Faces in colour Images, August 11, 1998. [8] Gerald Friedland, Kristian Jantz, Lars Knipping, Raul Rojas, Image Segmentation by Uniform colour Clustering Approach and Benchmark Results. [9] Yining Deng, B. S. Manjunath, Hyundoo Shin, colour Image Segmentation. [10] Khang Siang Tan, Nor Ashidi Mat Isa, colour image segmentation using histogram thresholding - Fuzzy C-means hybrid approach. [11] Wladyslaw Skarbek, Andreas Koschan, colour Image Segmentation - A Survey -. [12] H.D. Cheng, X.H. Jiang, Y. Sun, Jingli Wang, colour image segmentation: advances and prospects. [13] Zhiding Yu, Oscar C. Au, Roubing Zou, Weiyu Yu, Jing Tian, An adaptive unsupervised approach toward pixel clustering and colour image segmentation. [14] Kevin McGuinness, Noel E. O’Connor, A comparative evaluation of interactive segmentation algorithms. [15] Y. Deng, C. Kenney, M.S. Moore, and B.S. Manjunath, Peer group filtering and perceptual colour image quantization. [16] Tomasz Adamek, Noel E. OConnor, Noel Murphy, Region-based Segmentation of images using syntatic visual features. [17] Charles Poynton, ColorFAQ.
33