Individuele cellen uit plaatje isoleren?

Pagina: 1
Acties:

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Ik ben op zoek naar 'n snelle manier om individuele cellen uit een plaatje te isoleren. Wat bedoel ik hiermee? Het volgende :

Ik krijg een willekeurig input-plaatje in mijn programma. Dit plaatje converteer ik naar een vijftal grijswaarden, zodat je vlakken krijgt. Ik wil deze vlakken stuk voor stuk isoleren.

Ik heb wel wat bedacht, maar da's vrij moeilijk te implementeren, vereist vrij veel geheugen. Het volgende : Maak een functie die vanaf een bepaalde pixel start, controleert of die pixel bij een bep. kleur hoort, en zo ja, die pixel markeert en zichzelf aanroept voor alle omliggende pixels. Punt is : dan moet daarna het ge-markeerde vlak ge-kopiëerd worden naar een nieuwe image, met precies de omvang van het vlak. Ten eerste weet ik niet goed hoe nou die omvang te bepalen dan om het hele plaatje een keer af te lopen. Da's niet erg efficiënt.

Kortom : allemaal niet erg efficiënt. Ik kán het wel (ben er al hard aan bezig), maar ik vind het allemaal behoorlijk moeilijk worden, en ik dacht, daar moét toch haast wel een beter alghoritme voor te vinden zijn. Niet?

Alvast bedankt!

Genoeg is meer dan veel, en tart den overvloed


  • Juup
  • Registratie: Februari 2000
  • Niet online
Misschien kun je gaan zoeken naar de overgangen tussen 2 vlakken en die volgend in 2 richtingen tot je een lus hebt ofzo?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • windancer
  • Registratie: Maart 2000
  • Laatst online: 18-08 22:36
Zoek op het internet eens naar "FloodFill" en andere functies om gelijk gekleurde vlakken te vullen.

  • lordsnow
  • Registratie: Maart 2000
  • Laatst online: 29-08 13:02

lordsnow

I know nothing

toon 's een plaatje als voorbeeld! Dan weten we gelijk heel wat meer, en krijgen we ook heel wat beter inzicht in hoe we dit probleem zouden kunnen oplossen.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Bij je orginele gedachte zit je al een aardig eind op de goeie weg. Gewoon pixels markeren om aan te geven of ze er wel of niett bijhoren. Het algoritme wat je net noemt is het floodfill algoritme. Gewoon een functie die je aanroept met een pixel en die vervolgens zichzelf aanroept op zijn buren.

Als je er gewoon voor zorgt dat die functie alleen buren aanroept die 1 dezelfde kleur hebben en 2 nog niet zijn behandeld krijg je zo je cel. Het bijhouden kun je doen met een 'plaatje' van booleans. Dit is gewoon een 2 dimensionale array die je initialiseerd op false. Een gevonden pixel betekend dat je de bijbehorende boolean op true zet.

Het vinden van de afmetingen is ook niet zo lastig. Als je bijhoudt wat de maximale en minimale gevonden x en y waarden zijn heb je aan het eind precies het rechthoek dat je eruit moet knippen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Janoz schreef op 01 september 2002 @ 22:28:
Bij je orginele gedachte zit je al een aardig eind op de goeie weg. Gewoon pixels markeren om aan te geven of ze er wel of niett bijhoren. Het algoritme wat je net noemt is het floodfill algoritme. Gewoon een functie die je aanroept met een pixel en die vervolgens zichzelf aanroept op zijn buren.

Als je er gewoon voor zorgt dat die functie alleen buren aanroept die 1 dezelfde kleur hebben en 2 nog niet zijn behandeld krijg je zo je cel. Het bijhouden kun je doen met een 'plaatje' van booleans. Dit is gewoon een 2 dimensionale array die je initialiseerd op false. Een gevonden pixel betekend dat je de bijbehorende boolean op true zet.

Het vinden van de afmetingen is ook niet zo lastig. Als je bijhoudt wat de maximale en minimale gevonden x en y waarden zijn heb je aan het eind precies het rechthoek dat je eruit moet knippen.
Hmm, ja dat had ik dus idd. zelf in gedachten. Het punt is dat ik dat zelf nogal behoorlijk lastig vond om te programmeren. Vandaar dat ik dacht : laat ik hier eens ff een beetje "pollen" of er iemand op een betere/gemakkelijkere methode kan komen.

Genoeg is meer dan veel, en tart den overvloed


  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
lordsnow schreef op 01 september 2002 @ 22:06:
toon 's een plaatje als voorbeeld! Dan weten we gelijk heel wat meer, en krijgen we ook heel wat beter inzicht in hoe we dit probleem zouden kunnen oplossen.
Okee, ik heb het volgende plaatje ff snel in paint gemaakt :
Afbeeldingslocatie: http://home.hetnet.nl/~babipanghang/tweakers/voorbeeld.gif
Dat zijn dus 3 cirkels, waarvan 1 overlappend. Nou wil ik een proggie maken wat die 3 cirkels en de achtergrond op basis van vlakherkenning scheidt, en ieder in een aparte bitmap zet. Dus je krijgt dan 3 bitmaps met een cirkel, en 1 met de witte achtergrond.

Genoeg is meer dan veel, en tart den overvloed


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

NaliXL schreef op 02 september 2002 @ 00:04:
[...]

Okee, ik heb het volgende plaatje ff snel in paint gemaakt :
[afbeelding]
Dat zijn dus 3 cirkels, waarvan 1 overlappend. Nou wil ik een proggie maken wat die 3 cirkels en de achtergrond op basis van vlakherkenning scheidt, en ieder in een aparte bitmap zet. Dus je krijgt dan 3 bitmaps met een cirkel, en 1 met de witte achtergrond.


hmm .. waarschijnlijk krijg je 2 gewone cirkels en 1 met een hapje eruit. Als je zelfs wil dat je algoritme dat gaat reconstrueren dan zul je behoorlijk wat meer over de mogelijk te komen plaatjes moeten zeggen. Ik neem namelijk niet aan dat het allemaal perfecte cirkels gaan worden...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Janoz schreef op 02 september 2002 @ 09:23:
Ik neem namelijk niet aan dat het allemaal perfecte cirkels gaan worden...
Nee, gelijk heb je. Het kan praktisch ieder niet-geänimeerd plaatje zijn wat op het web te vinden is. De truuk is dat ik, zoals ik al zei, alles in (ongeveer) 5 grijstinten converteer. Dit op de volgende manier :

grijstint = round(((rood + groen + blauw) / 3) / (255 / 5))

En dat dan natuurlijk voor iedere pixel. Op die manier krijg je vlakken van op elkaar lijkende kleuren. Zo krijg je in de portretfoto bijvoorbeeld een vlak voor het haar, een vlak voor het gezicht, twee vlakken voor de ogen, een vlak voor de mond etc.

Genoeg is meer dan veel, en tart den overvloed

Pagina: 1