INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Thresholding recht langsam



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

02.07.2010, 15:02 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2010 15:05 von mint.)
Beitrag #1

mint Offline
LVF-Neueinsteiger


Beiträge: 8
Registriert seit: Nov 2008

6.i, 6.1, 8.5.1
2008
de

12489
Deutschland
Thresholding recht langsam
Hallo liebes Forum,

ich habe eine Thresholding-Programm geschrieben, welches aber recht langsam ist.
Da ich noch LV Anfänger bin habe ich hier schon mein bestes gegeben, aber wenn der ein oder andere nch eine Idee hat,
wie man dieses Program schneller werden lassen kann, wäre das super. Smile


Zum Programm:

1. Es wird ein Array eingelesen, in Form eines Bildes.
(Daran kann ich leider nichts ändern, dass sind meine Ausgangs vorgaben. Es MUSS mit einem Array gearbeitet werden.)

2. Es wird Threshold bestimmt, nach dem folgendem Algorythmus:

<blockquote>a) An initial threshold (T) is chosen, this can be done randomly or according to any other method desired.
b) The image is segmented into object and background pixels as described above, creating two sets:
<blockquote>G1 = {f(m,n):f(m,n)>T} (object pixels)
G2 = {f(m,n):f(m,n)leT} (background pixels) (note, f(m,n) is the value of the pixel located in the mth column, nth row)</blockquote>
c) The average of each set is computed.
<blockquote> m1 = average value of G1
m2 = average value of G2</blockquote>
d) A new threshold is created that is the average of m1 and m2
T’ = (m1 + m2)/2
e) Go back to step b), now using the new threshold computed in step four, keep repeating until the new threshold matches the one before it (i.e. until convergence has been reached).
(Quelle: Wikipedia)</blockquote>

Diesen Algorythmus würde ich gerne beibehalten, da er für die Bilder, die ich bearbeiten muss am besten funktioniert.

3. Es wird ausgezählt wie viele Werte unter und über dem Threshold liegen.


Das wirklich langsame an dem Programm ist der Thresholding Teil und zu dem hätte ich gerne Hilfe.
Kann man den schlanker Implementieren, sodass das ganze schneller wird?
Jemand Ideen dazu? Unsure

Vielen Dank im Vorraus!

Rebecca



Sonstige .vi  test.vi (Größe: 27,36 KB / Downloads: 214)
in LV 8.6
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
02.07.2010, 16:06 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2010 16:31 von IchSelbst.)
Beitrag #2

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Thresholding recht langsam
' schrieb:Das wirklich langsame an dem Programm ist der Thresholding Teil
Ja, das kann ich nachvollziehen.

Nur eins:
AutoIndex-Ausgänge an einer While-Schleife sind bezogen auf das Speichermanagement für Arrays ganz schlecht. Theoretisch wird nämlich bei jedem Schleifendurchlauf neuer Speicher alloziert und kopiert - das dauert, dauer, dauert ...

Alle deine While-Schleifen kann man durch FOR-Schleifen ersetzen: Weil die Abbruchbedingung nicht von einer Berechnung innerhalb der While-Schleife abhängt.

Ich hab die rechte While-Schleife mal ersetzt. Kuck mal, ob das noch passt.

Lv86_img

Nachtrag:
Ich hab mal noch eine Änderung angebracht. Eine While-Schleife hab ich durch eine FOR-Schleife ersetzt - dabei hat sich automatisch das eine Array eliminiert. Bevor ich da weiter mache, möchte ich schon wissen, ob das noch geht.


Angehängte Datei(en)
Sonstige .vi  test.vi (Größe: 12,72 KB / Downloads: 175)

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
02.07.2010, 19:52 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2010 20:03 von jg.)
Beitrag #3

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Thresholding recht langsam
Hallo,

den Anfang der (korrekten) Kritik hat IchSelbst schon gemacht. Alle While-Schleifen können durch For-Schleifen mit aktiviertem Autoindexing ersetzt werden. Das ist in LabVIEW wesentlich effektiver.

Weitere Kritikpunkte: Die Case-Struktur, die den ersten Schleifendurchlauf von den anderen unterscheidet, ist überflüssig, wenn man das Shiftregister entsprechend initialisert.

Dann hast du in der innersten Schleife 2 Case-Strukturen nebeneinander, die aber 2x dieselbe Fallunterscheidung machen. Überflüssig, kann man zusammenfassen.

Laufzeitmäßig tödlich ist natürlich, dass du da per Autoindexing 3D-Arrays erzeugst! Vollkommen überflüssig. Du musst nur geschickt addieren. Eine ganze Reihe von Operationen kannst du dir sparen.

Dein VI lässt sich eindampfen auf das hier:
   
Lv86_img
Sonstige .vi  test3.vi (Größe: 12,26 KB / Downloads: 192)


Gruß, Jens

P.S.: Jetzt fordere ich aber, dass das LVF auch als Quelle zitiert wird.Lol



EDIT: Wenn du schon verhinderst, dass 3D-Arrays erstellt werden, bringt das schon einen riesigen Geschwindigkeitsgewinn:
   

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.07.2010, 16:54
Beitrag #4

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Thresholding recht langsam
Ich hab mal ein Beispiel gemacht, um Zeiten zu messen. Es geht um den Algorithmus "counting spots > focal size". Einmal mit doppelter FOR-Schleife wegen des 2DArr. Einmal mit den polymorphen Elementen "größer gleich", "Bool to U8", "U8 to I32", "Summe I32", und einmal in C.

Fazit:
Die manuelle Programmierung mit den 2 For-Schleifen ist schneller als die polymorphe, die ja eigentlich die LV-spezifische Programmierung ist. (Von der C-Lösung reden wir lieber nicht. Die ist zwar schnell getippt ...). Es ist aber zu beachten, dass die Verzweigung des 2DArr unbedingt vor der Sequenz geschehen muss. Alleine die Verzweigung kostet viel Zeit (Speicher allozieren und kopieren).

Die polymorphe Lösung hat den gewichtigen Nachteil, dass Arrays alloziert werden müssen - ganz schlecht, wie wir wissen.

Was auf jeden Fall beachtet werden muss: Warum muss der Vergleichswert DBL sein, wenn es U8 auch tut? Ebenso die Wandlung nach I64.

Lv86_img


Angehängte Datei(en)
Sonstige .vi  test4.vi (Größe: 14,59 KB / Downloads: 170)

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.07.2010, 16:20
Beitrag #5

mint Offline
LVF-Neueinsteiger


Beiträge: 8
Registriert seit: Nov 2008

6.i, 6.1, 8.5.1
2008
de

12489
Deutschland
Thresholding recht langsam
Hallo!

@IchSelbst: "Was auf jeden Fall beachtet werden muss: Warum muss der Vergleichswert DBL sein, wenn es U8 auch tut? Ebenso die Wandlung nach I64. "

Die Wandlung nach I64 erfolgt um den Zahlenbereich zu vergrößern, da der durch U8/I8 vorgegebene Zahlenbereich zu klein ist um die hier entstehenden Summen zu händeln.
Mit U8 hatte ich ursprünglich angefangen, und bekam dann sehr kuriose Werte raus, die mich überhaupt auf diese Umwandlung brachten.
Für den Vergleichswert sollte es I64 oder I32 auch tun, sodass man hier nicht zusäztlich wandeln muss.
Bei meiner Version hat LV da rumgesponnen, als ich das mit I64 ausprobiert habe; KA warum.


@ Jens G
Nachdem ich dein Programm jetzt ausführlich auseinandergepuhlt habe und begeistert festgestellt habe: Es Funktioniert!
Ein Dickes Kompliment: Sehr schön, sehr elegant gelöst!
Ich hätte das so nicht gekonnt und wäre vorallem auf diese hübschen Summationen gar nicht erst gekommen.

Vielen, vielen lieben Dank!

Ich werd' das LVF auch brav als Quelle in das Programm hinenschreiben. ;-)

Beste Grüße, Rebecca
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.07.2010, 17:19 (Dieser Beitrag wurde zuletzt bearbeitet: 28.07.2010 18:24 von Lucki.)
Beitrag #6

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Thresholding recht langsam
Das 2D-Array läßt sich auf 1D umformen. Man braucht dann keine verschachtelten For-Schleifen mehr. Das bringt für die Geschwindigkeit wahrscheinlich nicht viel, aber mir gefällt es so einfach besser Mellow.
Es ist aber absolut tödlich für die Geschwindigkeit, wenn bei geschätzten 10^7 Bildpunkten in der innersten Schleife 10^7 mal von Integer nach DBL konvertiert wird! Die Integerwerte sind vermutlich groß genug, daß ein Rundung auf ganze Zahlen keinen Fehler verursacht. Habs mal gemacht.
Zwei Realzahlen auf Gleichheit zu testen, wie in diesm VI, funktioniert sowieso in der Regel nicht. Deshalb wundert es mich sehr, daß das Programm so wie es war überhaupt jemals beendet wird.
Habe mal alles auf Integer-Berechnung umgestellt, ich hoffe, es ist jetzt noch um einige Zehnerpotenzen schneller Mellow
(Testen kann ich es nicht, daß ich das ADDON nicht habe)

   
Lv85_img
Sonstige .vi  test3WA.vi (Größe: 17,77 KB / Downloads: 182)


Edit: Ich hatte mich auf das VI von Jens in #3 bezogen. Jetzt sehe ich, daß IchSelbst bereits die Realzahlen aus der Welt geschafft hat und so diese Konvertierungen auch vermeidet. Habe das VI (nicht die Graphik) geändert und den Simulator von IchSelbst angeschlossen. Zeitverbrauch des VIs mit dem Simulator 5000*5000 Pixel: 1.7 sec
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Gehe zu: