Bilder "schärfen" + Autokorrektur?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Bilder "schärfen" + Autokorrektur?

Beitrag 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
PB 6.21 | Win 11
Benutzeravatar
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?

Beitrag 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.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Bilder "schärfen" + Autokorrektur?

Beitrag 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...
PB 6.21 | Win 11
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Bilder "schärfen" + Autokorrektur?

Beitrag von c4s »

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
Benutzeravatar
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?

Beitrag von NicTheQuick »

Ich bastel mal ein bisschen rum. Kann aber morgen oder übermorgen werden.
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Bilder "schärfen" + Autokorrektur?

Beitrag von dige »

Bekunde hiermit auch mein Interesse .. und schon mal Danke Nic!
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
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?

Beitrag 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")
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bilder "schärfen" + Autokorrektur?

Beitrag 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.
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
Benutzeravatar
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?

Beitrag 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.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Bilder "schärfen" + Autokorrektur?

Beitrag 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.
PB 6.21 | Win 11
Antworten