woensdag 3 december 2008

Wallpaper group classificatie

Het is weeral een tijdje geleden sinds mijn laatste blogpost. Door de Athensweek en een stagepresentatie heb ik niet zo bijster veel tijd gehad.

De laatste week heb ik mij vooral bezig gehouden met de wallpaper group classificatie. Nu ik de translatievectoren kan bepalen, ben ik in staat een median tile te berekenen, een soort representatieve tegel. Dit gebeurt door verschillende tegels uit te knippen uit de textuur, deze te matchen op elkaar, dus ervoor te zorgen dat ze op elkaar passen (dit gebeurt momenteel nog op een discrete schaal, dus op pixelniveau, maar in de toekomst zou ik via bilineaire interpolatie een continue schaal gebruiken), en vervolgens per pixel de mediaanintensiteit te nemen.

Eenmaal deze median tile berekend, pas ik elk van de 8 mogelijke symmetrieën (180°, 120°, 90° en 60° rotatiesymmetrie en reflectie over de translatie- en de diagonaalassen waarbij er eventueel glide reflection is) toe op de textuur. Vervolgens correleer ik de median tile met de getransformeerde textuur en zoek het maximum daarvan. Daarna registreer ik de median tile met de textuur, vertrekkende vanaf dit maximum, via de SSD (sum of squared differences). Op deze positie wordt dan de trimmed normalized residual error berekend. Ook op naburige roosterpunten wordt deze error berekend. Nu is het zo dat sommige stukken in de correlatiefunctie niet zo interessant zijn, voornamelijk de randen. Die naburige roosterpunten mogen dus enkel in het centrum van de correlatiefunctie genomen worden. De implementatie hiervan leek initieel vrij eenvoudig, maar het heeft me toch even gekost om dit te implementeren. Uiteindelijk worden van al deze errors de mediaan genomen zodat men er zeker van is dat in de getransformeerde textuur het rooster opnieuw aanwezig is. Via een threshold die berekend is via een Chi²-distributie wordt dan bepaald of deze error klein genoeg is om met 99% zekerheid te zeggen dat de symmetrie voor deze textuur van toepassing is. Als laatste wordt voor de reflecties bekeken of het al dan niet glide reflections zijn. Dit laatste stuk heb ik evenwel nog niet kunnen implementeren.

De resultaten die ik haal met deze implementatie stemmen niet helemaal overeen met diegene uit de paper. Deze zijn gemiddeld heel wat minder goed. Enkele vergelijkingen:

Textuur 1: cmm

Textuur 2: pgg

Textuur 3: p6

In tabel 1 worden de resultaten vergeleken. De threshold ligt op 1, dus indien de error minder is dan 1, is de symmetrie van toepassing. De eerste 3 tabelregels zijn resultaten uit de paper, de volgende 3 zijn mijn resultaten. Voor (1) en vooral voor (2) zijn de resultaten relatief hetzelfde, buiten het feit dat mijn algoritme nog geen glide reflection kan detecteren. Voor (3) is er al meer verschil en is de uitkomst zelfs dubbelzinnig.

Tabel 1: trimmed normalized residual error van verschillende symmetrieën voor verschillende texturen en de uitkomst van het classificatiealgoritme

Conclusie is dat het algoritme redelijke resultaten aflevert die meestal kloppen, maar toch nog te dikwijls fout zijn. Een belangrijke reden hiervoor is dat de beschrijving van het algoritme relatief vaag is. Heel wat elementen en parameters moeten zelf bedacht worden.

Het algoritme geeft ook enkel goede resultaten bij reguliere texturen. Bij near-regular textures zijn de resultaten veel minder goed. Om dit probleem te counteren, staat er in de paper nog een tweede algoritme beschreven dat ik de komende weken zal proberen implementeren.

Geen opmerkingen: