Bilder "schärfen" + Autokorrektur?
Bilder "schärfen" + Autokorrektur?
Hallo,
im Forum findet man ja viele Beispiele zu klassischen Bildbearbeitung wie Kontrast, Helligkeit, Gamma usw.
Wozu ich aber nichts finde: Das Schärfen von Bildern (BMP/JPG) sowie Autokorrektur!
Gibt's dazu irgendeine schnelle Funktion?
Danke,
Delle
im Forum findet man ja viele Beispiele zu klassischen Bildbearbeitung wie Kontrast, Helligkeit, Gamma usw.
Wozu ich aber nichts finde: Das Schärfen von Bildern (BMP/JPG) sowie Autokorrektur!
Gibt's dazu irgendeine schnelle Funktion?
Danke,
Delle
PB 6.21 | Win 11
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Bilder "schärfen" + Autokorrektur?
Wir haben gerade diese Woche Deblurring-Algorithmen durchgenommen auf der Basis von FFT-Transformationen. Aber ich hab jetzt auch zu wenig Zeit diese für PureBasic zu übersetzen. Ich kann dir aber die Folien aus der Vorlesung dazu anbieten und vielleicht auch den Code aus der Übung. Der ist aber in C++ geschrieben.
Mit Autokorrektur meinst du wahrscheinlich eine automatisch Korrektur der Farben, oder? Irgendwer hier im Forum hat das auch mal gemacht in einem kleinen Programm von sich. Ich weiß aber nicht mehr, wer das war.
Mit Autokorrektur meinst du wahrscheinlich eine automatisch Korrektur der Farben, oder? Irgendwer hier im Forum hat das auch mal gemacht in einem kleinen Programm von sich. Ich weiß aber nicht mehr, wer das war.
Re: Bilder "schärfen" + Autokorrektur?
Puh.... und Du meinst ich krieg das dann allein hin?NicTheQuick hat geschrieben:Wir haben gerade diese Woche Deblurring-Algorithmen durchgenommen auf der Basis von FFT-Transformationen. Aber ich hab jetzt auch zu wenig Zeit diese für PureBasic zu übersetzen. Ich kann dir aber die Folien aus der Vorlesung dazu anbieten und vielleicht auch den Code aus der Übung. Der ist aber in C++ geschrieben.

Ja zumindest heißt die deutsche Funktion in vielen Grafikprogrammen so...NicTheQuick hat geschrieben:Mit Autokorrektur meinst du wahrscheinlich eine automatisch Korrektur der Farben, oder? Irgendwer hier im Forum hat das auch mal gemacht in einem kleinen Programm von sich. Ich weiß aber nicht mehr, wer das war.
PB 6.21 | Win 11
Re: Bilder "schärfen" + Autokorrektur?
Ich wäre auch interessiert. 

"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Bilder "schärfen" + Autokorrektur?
Ich bastel mal ein bisschen rum. Kann aber morgen oder übermorgen werden.
Re: Bilder "schärfen" + Autokorrektur?
Bekunde hiermit auch mein Interesse .. und schon mal Danke Nic!
"Papa, ich laufe schneller - dann ist es nicht so weit."
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Bilder "schärfen" + Autokorrektur?
Die zweidimensionale diskrete Fouriertransformation geht schon mal. Momentan ist es aber noch nicht die Fast Fouriertransformation, deswegen dauert ein Bild von 50 mal 50 Pixel bei mir noch 2500 Millisekunden. Das geht mit einem FFT natürlich wesentlich schneller.
Code: Alles auswählen
EnableExplicit
Structure Complex
r.d
i.d
EndStructure
Procedure DFT_2D(*input.Double, *output.Complex, width.i, height.i)
Protected i.i, j.i, x.i, y.i, d.d, *pixel.Double, *pixelOut.Complex
Protected invSqSize.d = 1. / Sqr(width * height)
*pixelOut = *output
For i = 0 To width - 1
For j = 0 To height - 1
*pixel = *input
*pixelOut\r = 0.0
*pixelOut\i = 0.0
For x = 0 To width - 1
For y = 0 To height -1
;exp(-imag * 2 * pi * i * x / width) * exp(-imag * 2 * pi * j * y / height)
;= cos((2 * pi * x * i) / width + (2 * pi * y * j) / height) - imag * sin((2 * pi * x * i) / width + (2 * pi * y * j) / height)
d = 2 * #PI * ((x * i) / width + (y * j) / height)
*pixelOut\r + (*pixel\d * Cos(d))
*pixelOut\i + (*pixel\d * -Sin(d))
*pixel + SizeOf(Double)
Next
Next
;Debug StrD(*pixelOut\r, 4) + " + " + StrD(*pixelOut\i, 4) + "i"
*pixelOut\r * invSqSize
*pixelOut\i * invSqSize
*pixelOut + SizeOf(Complex)
Next
Next
EndProcedure
Procedure InvDFT_2D(*input.Complex, *output.Double, width.i, height.i)
Protected i.i, j.i, x.i, y.i, *pixel.Complex, *pixelOut.Double
Protected real.d, imag.d, d.d, tmpReal.d, tmpImag.d
Protected invSqSize.d = 1. / Sqr(width * height)
*pixelOut = *output
For i = 0 To width - 1
For j = 0 To height - 1
*pixel = *input
tmpReal = 0.0
tmpImag = 0.0
For x = 0 To width - 1
For y = 0 To height -1
;exp(imag * 2 * pi * i * x / width) * exp(imag * 2 * pi * j * y / height)
;= cos((2 * pi * x * i) / width -(2 * pi * y * j) / height) - imag * sin((2 * pi * x * i) / width - (2 * pi * y * j) / height)
d = (2 * #PI * x * i) / width + (2 * #PI * y * j) / height
real = Cos(d)
imag = Sin(d)
tmpReal + (real * *pixel\r - imag * *pixel\i)
tmpImag + (real * *pixel\i + imag * *pixel\r)
*pixel + SizeOf(Complex)
Next
Next
*pixelOut\d = tmpReal * invSqSize
*pixelOut + SizeOf(Double)
Next
Next
EndProcedure
#width = 2
#height = 2
Dim image.d(#width - 1, #height - 1)
Dim fft.Complex(#width - 1, #height - 1)
Dim image2.d(#width - 1, #height - 1)
Define timeGenerate.i, timeDFT.i, timeInvDFT.i
Define i.i, j.i
timeGenerate = ElapsedMilliseconds()
For i = 0 To #width - 1
For j = 0 To #height - 1
image(i, j) = Random(100) / 100.
Next
Next
timeGenerate = ElapsedMilliseconds() - timeGenerate
; image(0, 0) = 4 ;7.07
; image(0, 1) = 3.5 ;1.06 - 2.06i
; image(0, 2) = 4 ;0
; image(0, 3) = 3.5 ;1.06 + 0.06i
; image(0, 4) = 1 ;0
; image(0, 5) = 1.5 ;1.06 - 0.06i
; image(0, 6) = 1 ;0
; image(0, 7) = 1.5 ;1.06 + 2.06i
Debug "-------"
timeDFT = ElapsedMilliseconds()
DFT_2D(@image(), @fft(), #width, #height)
timeDFT = ElapsedMilliseconds() - timeDFT
For i = 0 To #width - 1
For j = 0 To #height - 1
Debug StrD(image(i, j), 4)
Next
Next
Debug "-------"
For i = 0 To #width - 1
For j = 0 To #height - 1
Debug StrD(fft(i, j)\r, 4) + " + " + StrD(fft(i, j)\i, 4) + "i"
Next
Next
Debug "-------"
timeInvDFT = ElapsedMilliseconds()
InvDFT_2D(@fft(), @image2(), #width, #height)
timeInvDFT = ElapsedMilliseconds() - timeInvDFT
For i = 0 To #width - 1
For j = 0 To #height - 1
Debug StrD(image2(i, j), 4)
Next
Next
MessageRequester("Running time", "Generate: " + Str(timeGenerate) + " ms" + #LF$ + "DFT: " + Str(timeDFT) + " ms" + #LF$ + "Inverse DFT: " + Str(timeInvDFT) + " ms")
Re: Bilder "schärfen" + Autokorrektur?
Irgendwas ist in der Rücktransformation falsch.
F({1, -1, 1, -1}) ergibt richtigerweise {0,0,2,0}
Aber die Rücktransformation IF({0,0,2,0}) ergibt bei dir: {1, 1, 1, 1} sollte aber {1,-1,1,-1}
Liegt vermutlich daran, dass du bei der Rücktransformation einfach den Betrag nimmst.
Bei Bildern mag das ja funktionieren, aber wenn jemand diese Prozeduren für andere Sachen nutzt, solltest du doch lieber den Realteil (und Imaginärteil) wieder zurückgeben.
Also sollte sowohl *input als auch *output immer Complex sein, wenn du den Prozedurenamen so lässt.
Klar dann müsste auch bei DFT_2D der Imaginärteil mit eingehen.
F({1, -1, 1, -1}) ergibt richtigerweise {0,0,2,0}
Aber die Rücktransformation IF({0,0,2,0}) ergibt bei dir: {1, 1, 1, 1} sollte aber {1,-1,1,-1}
Liegt vermutlich daran, dass du bei der Rücktransformation einfach den Betrag nimmst.
Bei Bildern mag das ja funktionieren, aber wenn jemand diese Prozeduren für andere Sachen nutzt, solltest du doch lieber den Realteil (und Imaginärteil) wieder zurückgeben.
Also sollte sowohl *input als auch *output immer Complex sein, wenn du den Prozedurenamen so lässt.
Klar dann müsste auch bei DFT_2D der Imaginärteil mit eingehen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Bilder "schärfen" + Autokorrektur?
Ja, du hast Recht. Ich habe es jetzt so geändert, dass der imaginäre Anteil bei der Rücktransformation komplett ignoriert wird, da er sowieso 0 sein sollte. Wenn man tatsächlich komplexe Werte als Eingangssignal nehmen will, kann ich ja noch demnächst zwei Varianten der Procedures anfertigen.
Re: Bilder "schärfen" + Autokorrektur?
Ist das jetzt zum schärfen oder die Autokorrektur? Und wie verwendet man das konkret? Einfach Bitmap-Handle rein?
Für die Autokorrektur hab ich folgende kurze Erklärung bei IrfanView gefunden:
Für die Autokorrektur hab ich folgende kurze Erklärung bei IrfanView gefunden:
The feature improves the brightess of the image using automatic calculations for brightness and gamma values.
PB 6.21 | Win 11