Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 13:34

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Wie funktioniert GaussBlur?
BeitragVerfasst: Mo Jun 19, 2006 15:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

mal ne frage... kann mir wer erklären wie der GaussianBlur funktioniert?? Also ich meine jetzt nicht mir nen fertigen Algo geben und so, sondern.. was genau macht der Blur?? :)

Mein problem ist, ich hab ihn zwar selber schon programmiert (halt nen Algo von C nach Delphi umgeschrieben), aber weiß nicht wirklich genau was er macht...
Irgendwie scheint der Blur ja mit einem Kernel-dingens zu arbeiten.. aber... *zuckt mit den schultern*

Wär super wenn mir da jemand helfen könnte :)
Und bitte nicht nur auf Wikipedia oder so verweisen... da steht soviel mathematischer kram, da blick ich garnichmehr durch :p

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 16:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
äähh.... soweit ich weiss werden da pixel verschoben... aber bevor ich jetzt blödsinn erzähle: http://en.wikipedia.org/wiki/Gaussian_Blur

:shock:

Also ich brauch für GIMP nicht Ring0-Privilegien, um den Gauss-Weichzeichner zu verwenden....

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 17:02 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Wieso keine Wikilinks?
http://wiki.delphigl.com/index.php/Convolution-Filter#Gaussian_Blur


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 17:40 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Das Gaussian Blur entstand aus einer Formel aus der Statistik, und zwar aus der Gausschen-Normalverteilung. Mit dieser Verteilung kann man viele Probleme in der Statistik gut annähern und beispielsweise in der Biologie sind auch viele Verteilungen der Normalverteilung recht ähnlich (zB Körpergrößen und solche Sachen).

Die Normalverteilung hat ein paar interessante Eigenschaften, und zwar ist sie um einen gegebenen Erwartungswert (das Pixel das berechnet werden soll) herum gespiegelt, also links und rechts davon gleich. Des weiteren kannst du über den Varianz-Wert beeinflussen wie groß der Wertebereich sein soll welcher 2/3 des gesamten ausmacht, also im Falle von Blur: alle Pixel die ausserhalb dieses Bereiches liegen haben in Summe nur noch 1/3 Relevanz fürs Endergebnis. Durch die Varianz kannst du ebenfalls sagen ab wann die Werte so mehr oder weniger 0 werden, also so gut wie gar keine Relevanz mehr fürs Endergebnis besitzen.
Eine weitere wichtige Eigenschaft für Blur ist, dass die Funktion Integriert von -Unendlich bis +Unendlich genau 1 ergibt. Für unsere diskreten Werte beim Blur bedeutet dies, dass alle Werte der Matrix in Summe 1 ergeben sollen, damit das Bild nicht heller oder dunkler wird. Da wir aber nicht alle Werte die unendlich weit von unserem zu berechnenden Pixel sind verwenden, können wir ggf. noch die verwendeten Werte etwas modifizieren um nicht in Summe 0.99.. zu erhalten sondern genau 1.0.

In der Praxis kannst du über die Normalverteilung sagen (wenn du sie dir mal berechnet hast): Der Wertebereich [X|Y] tritt etwa zu so und so viel Prozent auf. Im diskreten Fall (auch Blur ist diskret) kannst du das auch für einen einzelnen Wert X sagen.

Das Blur ist nun eigentlich nur die Umkehrung des Ganzen, hier sagst du: der Wert X soll zu so und so viel Prozent einfluss auf das Ergebnis besitzen.

Das war jetzt alles auf 1D bezogen, der 2D-Fall ist auch nicht viel anders ... nur hat er halt eine 2. Dimension drinnen :-).

Die Moral von der Geschichte: Gaussian-Blur weil es schöne Ergebnisse liefert. Du kannst genausogut jede andere Funktion verwenden, nehmen wir beispielsweise mal den Abstand eines Pixels zum zu berechnenden Pixel, und je weiter das Pixel davon entfernt ist desto weniger Einfluss soll es auf das Ergebnis haben. Dann erstellst du dir eine Matrix wo du im Zentrum mal eine 1 hast, und danach je nach Abstand vom Zentrum:
f(dx,dy) = 1 / Wurzel(dx*dx+dy*dy)
Wobei dx und dy der x bzw. y Abstand zum mittleren Element der Matrix ist. Das einzige Problem was du jetzt noch hast ist, dass alle Werte in Summe größer sein werden als 1. Das musst du noch durch einen entsprechenden Skalierungsfaktor korrigieren, also du addierst alle Werte deiner Matrix und dividierst am Ende dein Ergebnis durch diesen Wert.

Dieses skalieren wird dir bei der Gauss-Verteilung mehr oder weniger erspart (wie gesagt die liefert bei Matrizen die groß genug sind ohnehin Werte die ein ganz klein wenig kleiner als 1.0 sind als Summe aller Elemente).

[edit]
Ach ja und weil wir gerade dabei sind ... weiß jemand wieso beim Gaussian Blur-Bild in unserem Wiki eigentlich ein Bias verwendet wurde? Ist etwas irritierend, da Bias nirgends erklärt wurde und auch hier nicht unbedingt viel Sinn macht (Die Summe aller Matrixelemente ist ja 1). Und weil wir jetzt gerade beim Bias sind ... die glPixelTransfer-Methode wäre in diesem Zusammenhang ggf. auch noch interessant :-).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 18:30 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Und wenn du wissen willst wie der Algo geht:

Du nimmst den Filterkern ausm Wiki und wendest ihn auf jeden Pixel des Bildes an...fertig. ;)

(Anwenden heißt: Du "legst" das Zentrum des Kerns auf das betreffende Pixel. Die benachbarten Pixel multiplizierst du mit den entsprechenden Werten in der Matrix. Dann summierst du alles auf und schreibst das ergebnis in das Ausgangsbild an der Stelle des "betreffenden Pixels".)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 18:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

oook, jetzt hab ich das ganze schon nen ganzes stück mehr verstanden :)
Tausend dank :)

2 Fragen nurnoch... beim Blur gibt man ja standardmäßg einen Radius an... ist der radius einfach nur die anzahl an benachbarten pixeln die das ergebnis beeinflussen??

Und, wie errechne ich die Matrix?
Zwar steht da im Wikipedia dashier:
Bild
aber mit sowas kann ich immer nix anfangen.. was ist dieses o?? Also "Standard Deviation"?

Aya~

PS: Wenn man jetzt seinen Blur auf einen radius von 0..100 beschränkt könnte man doch da einfach 100 matritzen speichern, die ändern sich ja nicht, oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 18:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Im "Göhler - Formelsammlung höhere Mathematik" waren seitenweise Tabellen drinnen mit solchen werten... Aber zum Glück haben wir Mathestudenten hier, die das alles erklären können.

Wegen den Matrizen: Es ist bestimmt effektiver die zu berechnen als zwischen zu speichern.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

das kleine sigma ist die Standardabweichung, im Grunde genommen ein frei wählbarer Wert.
Wie Lyr schon gesagt hat, stammt die Formel ursprünglich aus der Statistik.

Im englischen Wikipedia ist z.B. eine Gauss-Matrix für sigma = 0.84089642 vorgegeben.

Den Convolution-Biaswert kann man übrigens mit glConvolutionParameter setzen. ;)

Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 20:07 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Mich wundert es dass sie da auf Wikipedia so "salopp" sagen:
Zitat:
G(r) = ...
ODER
G(u,v) = ...
wobei r^2 = u^2+v^2

was meines Erachtens nicht ganz stimmt, denn G(r) ist der 1D-Fall und G(u,v) ist der 2D-Fall. Wenn man die 1. Formel für 2D verwendet (indem man sich r^2 mit u^2+v^2 berechnet) dann erhält man nach beiden Dimensionen integriert nicht mehr 1 sondern o*Wurzel(2*Pi) was nicht wirklich erwünscht ist. Also für 2D brauchst du da schon die G(u,v) - Formel. Wurde wie ich gerade sehe auf der Wikipedia-Diskussionsseite auch schon erwähnt dass da was nicht passt, obwohl die Meinung dort und vor allem der angegebene Link noch falscher ist als der jetztige Text :-), die wollen 2D ganz auf 1D reduzieren ...

Das u und das v ist jetzt dein x- bzw. y-Abstand zum Zentrum der Matrix. Also wenn deine Matrix KxK Elemente besitzt, dann ist ja das Zentrum der Matrix bei
x = (K-1)/2
y = (K-1)/2
Wenn (x,y) = (0,0) das linke obere Element der Matrix ist und (x,y) = (K-1,K-1) das rechte untere Element der Matrix. Somit ist der Abstand zum Zentrum je Achse:
u = x - (K-1)/2
v = y - (K-1)/2
Eigentlich
u = Betrag( x - (K-1)/2 )
gleiches für v. Aber den Betrag brauchen wir nicht, da wir u und v ohnehin quadrieren, wenn wir den gesamt-Abstand zum Zentrum wollen.

Nun wählst du dir noch ein o, das gibt einfach an wie "weich" das Ergebnis werden soll, also wieviel du dein Bild verwischen willst. Deine Matrix sollte dann etwa K=(6o+1) groß sein, kann natürlich aber auch größer oder kleiner sein. Wenn K kleiner ist, dann solltest du das Ergebnis aber noch mal auf 1 normalisieren, also so das die Summe aller Elemente 1 ergibt, da das Bild ansonnsten etwas stärker verdunkelt wird je kleiner deine Matrix wird.

Und nun brauchst du nur noch für das Element (x,y) deiner Matrix das u und v berechnen, und diese dann in die G(u,v)-Funktion einsetzen.

Wenn du deine Matrix ohnehin noch normalisierst, dann kannst du dir allerdings den konstanten Teil:
1/o^2*Pi*2
ganz sparen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
huhu *schaut total verwirrt*

also... nochmal langsam... *g*

Ich hab mir jetzt dashier zusammengebastelt:

Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3.   u, v: Integer;
  4.   g, r, o: Double;
  5.   x, y: Integer;
  6. begin
  7.   o:=0.84089642;
  8.   u:=7;
  9.   v:=7;
  10.   r:=sqrt(sqr(u) + sqr(v));
  11.   for x:=0 to u - 1 do begin
  12.     for y:=0 to v - 1 do begin
  13.       g:=(1 / (2 * pi * sqr(o))) * exp(-(sqr(x - (u - 1) / 2) + sqr(y - (v - 1) / 2)) / (2 * sqr(o)));
  14.       StringGrid1.Cells[x, y]:=FloatToStr(G);
  15.     end;
  16.   end;
  17. end;


Inwiefern stimmt da jetzt das "r" nicht??
Und, stimmt meine zeile in der ich "g" ausrechne?? Weil ich bekomme komplett andere werte raus als die bei wikipedia... :(

Aya~

EDIT: Hab meine g-zeile nochmal angepasst, geht aber immernochnich :(
EDIT2: Ahhhh ich hab's geschafft :p Hab die g-zeile angepasst, stimmt jetzt ^.^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 20:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Soo, hab das ganze ja nun hinbekommen... aaaber, wie ändere ich denn jetzt die Blur-Stärke??
Also das was man in den normalen programmen als Radius angibt.. ist das hier dieses o?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 20, 2006 01:55 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Ja die Blur-Stärke ist dieses o, aber wie gesagt je größer dieses o wird, desto größer sollte auch die Matrix werden. Dein Code sollte zwar korrekt sein, jedoch entspricht er nicht unbedingt der Namensgebung der Formel. Also zum besseren Verständis hier nochmal der Code und die Variablen (-Bezeichnungen) so wie sie in der Formel verwendet werden:

Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3.   u, v, k: Integer;
  4.   g, o: Double;
  5.   x, y: Integer;
  6. begin
  7.   o:=0.84089642;
  8.   k:=7;
  9.   for x:=0 to k - 1 do begin
  10.     for y:=0 to k - 1 do begin
  11.       u:= x - (k - 1) /2;
  12.       v:= y - (k - 1) /2;
  13.       g:=(1 / (2 * pi * sqr(o))) * exp(-(sqr(u) + sqr(v)) / (2 * sqr(o)));
  14.       StringGrid1.Cells[x, y]:=FloatToStr(g);
  15.     end;
  16.   end;
  17. end;


Hoffe das passt so, denn eigentlich kann ich gar kein Pascal (mehr) :-).

Du scheinst bei deinem Code u als x-Dimension der Matrix und v als y-Dimension der Matrix verwendet zu haben. Wäre zwar durchaus korrekt, aber eine nicht quadratische Matrix macht hier üblicherweise eher wenig Sinn.

Und einen Radius im eigentlichen Sinne gibt es hier nicht wirklich, denn eine Normalverteilung geht von -Unendlich bis +Unendlich. Mit dem o legst du lediglich fest, welcher Bereich 2/3 Einfluss nehmen soll. Bei einem Quadrat von (6o+1)x(6o+1) hast du den Bereich welcher ... sagen wir mal mindestens 99 Prozent des Einflusses abdeckt, das hängt von o ab.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]