Seite 1 von 2
Bilder "schärfen" + Autokorrektur?
Verfasst: 15.01.2012 18:39
von Delle
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
Re: Bilder "schärfen" + Autokorrektur?
Verfasst: 15.01.2012 19:24
von NicTheQuick
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.
Re: Bilder "schärfen" + Autokorrektur?
Verfasst: 15.01.2012 19:27
von Delle
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.
Puh.... und Du meinst ich krieg das dann allein hin?
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.
Ja zumindest heißt die deutsche Funktion in vielen Grafikprogrammen so...
Re: Bilder "schärfen" + Autokorrektur?
Verfasst: 15.01.2012 21:14
von c4s
Ich wäre auch interessiert.

Re: Bilder "schärfen" + Autokorrektur?
Verfasst: 15.01.2012 23:07
von NicTheQuick
Ich bastel mal ein bisschen rum. Kann aber morgen oder übermorgen werden.
Re: Bilder "schärfen" + Autokorrektur?
Verfasst: 16.01.2012 09:47
von dige
Bekunde hiermit auch mein Interesse .. und schon mal Danke Nic!
Re: Bilder "schärfen" + Autokorrektur?
Verfasst: 16.01.2012 13:09
von NicTheQuick
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?
Verfasst: 16.01.2012 13:49
von STARGÅTE
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.
Re: Bilder "schärfen" + Autokorrektur?
Verfasst: 16.01.2012 14:50
von NicTheQuick
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?
Verfasst: 16.01.2012 15:14
von Delle
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:
The feature improves the brightess of the image using automatic calculations for brightness and gamma values.