Problem beim Verwenden von 2D Arrays
Ich hab mir mal Gedanken gemacht.
Das Ergebnis ist der Delphicode - siehe unten. Er entspricht (im ersten Schritt) dem, was ich oben geschrieben habe: Bild = 1000*1000; Quadrat=11*11 (5*2+1=11); Mittelwert=1000*1000; Demnach wäre der Kontrast auch 1000*1000. Dabei ist mir ein Problem aufgefallen: Wie sieht das Mittelwertfenster (= das Quadrat) am Rande des Bildes aus. Am Punkt (0,0) kann man kein Mittelwertfenster der Größe 11x11 machen. Der Punkt (0,0) kann in keinem Fenster in der Mitte liegen. Demnach kann das Fenster um den Punkt (0,0) nur die Breite 1 haben, also den Punkt selbst. Diese Überlegung gilt für alle Punkte, die näher als 5 am Rand liegen. Durch diesen Sachverhalt erschwert sich die Berechung (respektive der Algorithmus) erheblich. Diese Überlegung hab ich in meinen Code mal außen vor gelassen. Verstehst du meine Überlegung?
Ein weiterer Punkt ist mir aufgefallen. Dein geposteter VI-Code bewirkt doch folgendes: Bild=1000x1000; Fenster=10x10; Kontrast=100x100 wegen Schleifenzähler = Länge div Fenster = 1000 div 10. Demnach ergibt dein LV nicht für jeden Bildpunkt einen Kontrastpunkt, sondern für jedes Bildfenster ergibt sich ein Kontrastpunkt. Ist das so gewollt respektive so richtig?
Hier mal der Code in Delphi. Den kann man - also du - mit etwas Überlegung nach C++ wandeln. Dieser Code, der erheblich mehr macht als dein LV-Code, braucht circa 600ms. Das liegt am beschriebenen "Gleitenden Mittelwert". Bild[] und Mittelwert[] sind dabei 2D-Arrays. Das sieht man daran, dass eben mittels zweier Schleifen über den Pointer zugegriffen wird. Es ist also ausreichend, einen "Datenzeiger" an die DLL zu übergeben.
[code]const BRows: cardinal = 1000;
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|