Springen naar inhoud

Hoe maak ik een grafiek van een foto?


  • Log in om te kunnen reageren

#1

DePurpereWolf

    DePurpereWolf


  • >5k berichten
  • 9240 berichten
  • VIP

Geplaatst op 19 augustus 2010 - 14:38

Ik heb een afbeelding, ik weet ook de resolutie van de foto, dus hoe groot elke pixel is.
Op de afbeelding staat een object, om het makkelijk te maken: een balk.
De balk is echter niet perfect recht, er zit variatie in de dikte van de balk. En die variatie wil ik weten, sterker nog, ik wil er statistiek op uitvoeren.

Hoe kan ik het beste van een lijn die over mijn foto loopt een grafiek maken? Ofwel, ik wil de coordinaten van de rand van het object in een x,y grafiek plotten.

Iemand een ideetje?

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

TeunisTVM

    TeunisTVM


  • >100 berichten
  • 119 berichten
  • Ervaren gebruiker

Geplaatst op 19 augustus 2010 - 14:40

Hoe wil je de grafiek hebben, met waardes?
Want je zou met microsoft visio de afbeelding kunnen plakken en de grafiek overtrekken
A person who never made a mistake never tried anything new
Make everything as simple as possible, but not simpler.
Albert Einstein

#3

physicalattraction

    physicalattraction


  • >1k berichten
  • 3104 berichten
  • Moderator

Geplaatst op 19 augustus 2010 - 14:44

Moeilijke vraag!

Heb je RGB waarden van elke pixel? Dan kan ik me het volgende voorstellen. Stel je balk is donker en je achtergrond is licht. Per pixel hou je in een matrix de lichtsterkte bij (dus iets van R+G+B). Stel, je balk loopt onder een hoek van 30 graden t.o.v. horizontaal. Dan maak je per verticale kolom in je matrix een nieuwe verticale kolom met daarin het verschil met de voorgaande. Daar waar je balk begint, is het contrast het hoogst. Nu zoek je op waar in je nieuwe kolom de hoogste waarde komt, dat is de y-coordinaat van waar je balk begint bij de bijbehorende x-coordinaat van de kolom. Bij de laagste waarde heb je de y-coordinaat van het einde van de balk.

#4

DePurpereWolf

    DePurpereWolf


  • >5k berichten
  • 9240 berichten
  • VIP

Geplaatst op 19 augustus 2010 - 15:39

Ja, iets in die richting, het is zwart-wit, dus dat maakt het al makkelijker. En verder zijn er wel een aantal technieken om de rand van de balk scherper te maken: http://en.wikipedia..../Edge_detection.

Dus als de balk horizontaal is gefotografeerd, per kolom het rij-nummer van de twee randen nemen en die van elkaar aftrekken, daarna de resolutie coefficient toevoegen.

Zoiets had ik in gedachten, maar ik vroeg me af of dit de beste manier is..

#5

Kalkoen

    Kalkoen


  • >250 berichten
  • 389 berichten
  • Ervaren gebruiker

Geplaatst op 19 augustus 2010 - 19:02

Importeren in autocad en met een lijntje overtrekken? Vervolgens kunt ge dan de X-Y coordinaten van die polygoon exporteren en gaan verwerken.

#6

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 19 augustus 2010 - 19:21

Ja, iets in die richting, het is zwart-wit, dus dat maakt het al makkelijker. En verder zijn er wel een aantal technieken om de rand van de balk scherper te maken: http://en.wikipedia..../Edge_detection.

Dus als de balk horizontaal is gefotografeerd, per kolom het rij-nummer van de twee randen nemen en die van elkaar aftrekken, daarna de resolutie coefficient toevoegen.

Zoiets had ik in gedachten, maar ik vroeg me af of dit de beste manier is..


Als je het wiskundig wil aanpakken, dan is edge-detection de manier. Er zijn verschillende algoritmes. Een van de betere technieken is de Canny Edge algoritme. Zie bijvoorbeeld hier: http://www.pages.dre...22/can_tut.html en http://marathon.csee..._detection.html
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#7

DePurpereWolf

    DePurpereWolf


  • >5k berichten
  • 9240 berichten
  • VIP

Geplaatst op 20 augustus 2010 - 13:33

De software die ik gebruik is Gwyddion, want een gratis te verkrijgen pakket is. Ik heb het beste resultaat niet met canny maar met Zero crossing edge detection.
Vandaar sla ik het op en importeer ik het in originlab. Originlab heeft de mogelijkheid om scripts uit te voeren en ik kan dan makkelijk de waardes opzoeken en in een grafiek planten.

#8

mcs51mc

    mcs51mc


  • >250 berichten
  • 470 berichten
  • Ervaren gebruiker

Geplaatst op 20 augustus 2010 - 18:45

Perssonlijk zou ik volgende stappen uitvoeren om tot de dikte van de balk te komen in iedere kolom:
1) Threshold level bepalen uit het histogram van de grijswaarden van het beeld
2) Alle pixels met een waarde boven die threshold zou ik een waarde 255 toewijzen
3) Alle pixels met een waarde onder die threshold zou ik een waarde 0 toewijzen
4) Per kolom de bovenste edge zoeken
5) Per kolom de onderste edge zoeken
6) Per kolom de waardes uit 4 en 5 van elkaar aftrekken
Zo heb je per kolom de dikte van je balk ;)

Dit is in LabVIEW met vision een koud kunstje :)
Alle hierboven beschreven algo's heb ik in de IMAQ lib van NI, ik moet ze enkel gebruiken :)

Is dit een ťťnmalig iets of moet je finaal tot een exe komen die live beelden verwerkt?
Als je mij een paar beelden kunt bezorgen (BMP formaat) wil ik dat wel even uitproberen zodanig dat je je eigen code kunt toetsen aan de algo's van NI.

Ik heb ooit iets dergelijks gemaakt om de hoogte van de tandjes tijdens de productie van lintzagen te meten.
Lintzaag kwam wel voorbij aan 30m/min ;)

#9

DePurpereWolf

    DePurpereWolf


  • >5k berichten
  • 9240 berichten
  • VIP

Geplaatst op 25 augustus 2010 - 09:58

Nou ken ik wel een beetje Labview, maar had ik er nooit aangedacht om dat er voor te gebruiken, ik ben eigenlijk best geinteresseerd in hoe je dat zou doen.

Ik geloof dat ik Vision heb geinstalleerd op deze pc.

Labview zal wel vele malen sneller zijn dan de methode die ik toepas.

Ik heb twee afbeeldingen bijgevoegd.

Resolutie is:

20x Horizontal 0.3247
20x Vertical 0.3226

Dus 0.3247 micron per pixel.

Bijlage  NAP163.zip   518,93K   19 maal gedownload

#10

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 25 augustus 2010 - 12:39

Aangezien het een grayscale en geen strikt zwart/wit plaatje is, gooi je veel informatie weg door alleen maar botweg te kijken naar "naar groter of kleiner dan de grenswaarde". Je kunt in dit soort plaatjes de grens ook op sub-pixelniveau bepalen, door te kijken waar hij van zijde wisselt (d.w.z. de ene pixel is groter en de andere kleiner dan de grenswaarde) en mee te wegen hoe ver hun waarde ervandaan ligt om de precieze rand-coŲrdinaat er tussenin te schatten.

Je krijgt dan bijvoorbeeld zoiets.



(zorg overigens dat je het plaatje op de juiste resolutie bekijkt, en niet laat verkleinen door je browser, anders zien de gladde randen van de grafiek er juist verrot uit)
In theory, there's no difference between theory and practice. In practice, there is.

#11

DePurpereWolf

    DePurpereWolf


  • >5k berichten
  • 9240 berichten
  • VIP

Geplaatst op 25 augustus 2010 - 13:24

Die afbeelding ziet er wel beter uit, maar door de grijswaarden is het moeilijk te bepalen waar de grens ligt, dat maakt dus de afstandsmeeting veel moeilijker. Hoe los je dat dan op?

#12

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 25 augustus 2010 - 13:59

Die grafiek met grijswaarden is een anti-aliased representatie van de waarde die je in eerste instantie bepaalt, dus die hoef je niet achteraf weer uit de grafiek te halen. De grafiek is alleen om te visualiseren dat er een nauwkeurige continue waarde uitkomt.
In theory, there's no difference between theory and practice. In practice, there is.

#13

DePurpereWolf

    DePurpereWolf


  • >5k berichten
  • 9240 berichten
  • VIP

Geplaatst op 25 augustus 2010 - 16:38

Ik zal het anders zeggen. De eerste methode, om een pixel een waarde van 0 of 255 te geven is makkelijker naderhand te bewerken. Je hebt immers dan een matrix met enkel twee cellen die 'true' zijn.
In plaats van een matrix waarbij je per kolom twee maxima moet vinden, en daaruit de afstand moet interpoleren.

Verder vraag ik me af of je wel natuurkundig gezien de juiste aannamens maakt voor deze geinterpoleerde lijn. De scherpte van de rand hangt namelijk ook af van hoe goed ik gefocused heb, en diffractie effecten.
Dit is natuurlijk altijd het probleem, dus vraag ik me af of met de meetafwijking van deze methode een meer accurate edge bepaling wel nodig is. Dus of de verbetering van de afstandbepaling kleiner is dan de meetfout van de gehele meetmethode.

#14

mcs51mc

    mcs51mc


  • >250 berichten
  • 470 berichten
  • Ervaren gebruiker

Geplaatst op 26 augustus 2010 - 06:40

Hierbij de dikte van jouw product in PIXELS met een threshold level van 40.
Vertrekkend van boven- en onderkant van het beeld wordt de eerste pixel met een grijswaarde lager dan 40 wordt aanzien als de edge.
Verwerkingstijd: een fractie van een seconde ;)

Bijgevoegde Bestanden


#15

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 26 augustus 2010 - 07:44

Ik zal het anders zeggen. De eerste methode, om een pixel een waarde van 0 of 255 te geven is makkelijker naderhand te bewerken. Je hebt immers dan een matrix met enkel twee cellen die 'true' zijn.
In plaats van een matrix waarbij je per kolom twee maxima moet vinden, en daaruit de afstand moet interpoleren.

Nogmaals, dat plaatje dat ik gepost had was alleen ter illustratie om de berekende grens grafisch weer te geven. Zo'n plaatje moet je verder niet bewerken of daaruit proberen de dikte weer terug te lezen ofzo.

Verder vraag ik me af of je wel natuurkundig gezien de juiste aannamens maakt voor deze geinterpoleerde lijn. De scherpte van de rand hangt namelijk ook af van hoe goed ik gefocused heb, en diffractie effecten.

Dat is een ander prettig aspect van deze benadering: daar hangt het juist nauwelijks vanaf. Focus en scherpte doet er niet zoveel toe, ook dan ligt de berekende grenswaarde nagenoeg op dezelfde hoogte. Tenzij het natuurlijk zů onscherp is dat kleine variaties er niet meer uit te halen zijn, maar dat is dan een mankement van de foto en niet van de techniek want die informatie zit dan simpelweg niet meer in het plaatje (en krijg je dus met geen enkele methode meer terug).

En diffractie effecten zorgen juist bij de 0/255 methode voor problemen, daar kun je soms ineens een piekje krijgen in je gegevens die in het plaatje eigenlijk helemaal niet aanwezig is (omdat door diffractie een waarde nťt wel boven de grenswaarde zit en die ernaast net niet). Met interpolatie treden dat soort effecten niet op.

Dit is natuurlijk altijd het probleem, dus vraag ik me af of met de meetafwijking van deze methode een meer accurate edge bepaling wel nodig is. Dus of de verbetering van de afstandbepaling kleiner is dan de meetfout van de gehele meetmethode.

Hangt er vanaf hoe nauwkeurig je de gegevens uberhaupt nodig hebt, en wat voor analyse je er precies mee doet. Maar als je de 'lompe' methode gebruikt krijg je dit soort gegevens: (even ingezoomd op een paar denkbeeldige pixels)

Geplaatste afbeelding in plaats van: Geplaatste afbeelding

En afgaand op je plaatje denk ik dat het dusdanig scherp c.q. nauwkeurig is dat het meer significante informatie bevat dan je verkrijgt met afronden.
Zelfs al zou het geÔnterpoleerde geval niet helemaal exact zijn, het ligt er in ieder geval veel dichter bij en geeft bovendien niet allerlei (op die schaal best grote) pieken die er in werkelijkheid helemaal niet zijn.





Hierbij de dikte van jouw product in PIXELS met een threshold level van 40.

Hier hetzelfde met mijn methode: (eveneens in pixels, maar dan dus met floating point waarden)

Bijgevoegde Bestanden

  • Bijlage  dikte.xls   57,5K   25 maal gedownload
In theory, there's no difference between theory and practice. In practice, there is.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures