Seite 1 von 2
Unscharfe Bilder erkennen.
Verfasst: Samstag 15. Dezember 2007, 17:50
von Carraia
Hallo.
Ich habe eine Reihe Bilder, die ich alle aus einem Video extrahiert habe. Einige sind interlaced(Kammmuster) und unscharf.
Ich suche einen Python-Code, der unscharfe bzw. Interlaced Bilder erkennen kann. Möglichst in Verbindung mit der PI-Bibliothek(PIL).
Ich habe es selbst nicht hinbekommen, aber gelesen, es sei durch Transformation in den Frequenzbereich leichter. Hier bin ich aber überfragt.
Grüße
C.
Verfasst: Samstag 15. Dezember 2007, 18:45
von nkoehring
oha... fuer solche Dinge brauchts ne Menge an Mathematik. Da kommen Leute wie Laplace und Fourier daher und nageln einem krasseste Algorithmen an die Backe, bevor man sowas selbst programmiert => Also ich solltes koennen, kanns aber nicht, weil ich die Analysis-II-Pruefung geschoben habe
Um dem Beitrag doch noch ein klein wenig Sinn zu verleihen: Fuer solche Dinge sind fertige Bildanalyse-Programme wohl empfehlenswert und zumindest ihre matheaufwaendigsten Bereiche sollten in C o.ä. geschrieben sein um performant zu bleiben.
Verfasst: Sonntag 16. Dezember 2007, 09:48
von Carraia
nkoehring hat geschrieben:Fuer solche Dinge sind fertige Bildanalyse-Programme wohl empfehlenswert und zumindest ihre matheaufwaendigsten Bereiche sollten in C o.ä. geschrieben sein um performant zu bleiben.
Gerade weil ich direkt in Python die Bilder von meiner Kamera einlese, ist es gut, sie auch direkt hier weiterzuverarbeiten.
Wer weiß eine Python - only Lösung.
Verfasst: Sonntag 16. Dezember 2007, 12:09
von Carraia
Mich läßt das Thema einfach nicht los.
Aber ich sehe auch kein richtiges Muster.
Frage: Die fft-Funktion von numpy, wenn ich der die RGB-Werte eines Punktes des jetzigen und folgenden Bildes gebe, wie deute ich das Ergebnis oder anders gefragt:
Wie nutze ich eine FFT mit diskreten Werten und wichtiger: Was fange ich mit dem Ergebnis an ?
Verfasst: Sonntag 16. Dezember 2007, 13:18
von BlackJack
Der FFT-Funktion einzelne Punkte oder Paare von Punkten zu übergeben bringt nichts. Ganz grob transformiert FFT eine Folge von Sample-Werten in Faktoren mit denen man verschiedene Frequenzen multiplizieren muss um daraus kombiniert wieder die ursprüngliche Samplefolge annähern zu können. Mit nur zwei Samplewerten lässt sich da nicht viel machen.
Wenn man eine Pixelspalte tranformiert und dort hohe Faktoren bei den hohen Frequenzen herauskommen, kann man vielleicht mit einer gewissen Wahrscheinlichkeit Aussagen darüber treffen, ob man es in diese Spalte mit Interlace zu tun hat oder nicht. Oder man transformiert die Pixel der geraden und ungeraden Pixel einer Spalte und vergleicht die Ergebnisse. Je grösser die Abweichung, desto wahrscheinlicher ist Interlace im Spiel. Bin da aber auch nicht der Experte und das ist eher eine Frage von Bildverarbeitungsalgorithmen denn eine Python-Frage. Da sind andere Foren/Newsgroups vielleicht eine bessere Quelle.
Verfasst: Sonntag 16. Dezember 2007, 14:13
von Carraia
Was ist eine Pixelspalte ?
Wie sieht deine Idee in Python aus (Beispiele) ?
Verfasst: Sonntag 16. Dezember 2007, 14:17
von BlackJack
Na eine Spalte mit Pixeln aus dem Bild halt. Bzw. die Werte eines der Känale (RGB) in einer Spalte in dem Bild.
Verfasst: Sonntag 16. Dezember 2007, 15:24
von Carraia
Wie sieht deine Idee in Python aus (Beispiele) ?
Verfasst: Sonntag 16. Dezember 2007, 16:01
von BlackJack
Ich weiss ja nicht einmal ob es funktioniert, da habe ich jetzt keine Lust Experimente zu machen.
Verfasst: Sonntag 16. Dezember 2007, 16:27
von Carraia
Das kann ich dir auch nicht sagen, denn ich kann dir nicht folgen.
Verfasst: Montag 17. Dezember 2007, 04:10
von nkoehring
Kennst du denn die mathematische Grundlage der FFT-Funktion Carraia? Ansonsten kannst du dich ja
einfach mal damit beschaeftigen.
Aber wie ich schon sagte... das ist nix, was man
mal eben macht.
Wikipedia ist da oft ein netter Ansatz:
http://en.wikipedia.org/wiki/Fast_Fourier_transform
bzw in deutsch
http://de.wikipedia.org/wiki/Schnelle_F ... sformation
Denn falls du BlackJacks Idee umsetzen moechtest, musst du ja auch wissen, was die Ergebnisse ueberhaupt bedeuten. Denn der nackte Vektor ist nicht sehr informativ

Verfasst: Montag 17. Dezember 2007, 06:17
von Carraia
nkoehring, was ich kann und nicht kann überläßt du mir. Schließlich bist du es, der seine Prüfungen schiebt.
Verfasst: Montag 17. Dezember 2007, 06:57
von nkoehring
Also ich sehe keine angreifende Haltung in meinem Text... in deinem schon. Vielleicht hast du etwas falsch aufgefasst?
Re: Unscharfe Bilder erkennen.
Verfasst: Montag 17. Dezember 2007, 09:13
von CM
Hoi,
Carraia hat geschrieben:Ich habe eine Reihe Bilder, die ich alle aus einem Video extrahiert habe. Einige sind interlaced(Kammmuster) und unscharf.
Habe mal was in der Richtung gemacht, aber Du stellst leider keine konkrete Frage. Daher möchte ich ein paar Fragen stellen:
- Was genau willst Du erkennen?
- Spielt die Farbinformation eine Rolle?
- Wie groß sind Deine Bilder? Wie groß die zu erkennenden Ausschnitte?
- Welche Form haben ggf. die zu erkennenden Ausschnitte (grob)?
Gruß,
Christian
Verfasst: Montag 17. Dezember 2007, 18:45
von Leonidas
Carraia hat geschrieben:nkoehring, was ich kann und nicht kann überläßt du mir. Schließlich bist du es, der seine Prüfungen schiebt.
Ich würde dich bitten sich etwas zu beruhigen, denn hier hat dich keiner auf irgendeine Weise angreifen wollen. Die Poster haben nur gemeint, dass das Problem nicht trivial ist und etwas an Mathematik erfordern.
Und freundlich bleiben erhöht sowieso deine Chancen eine brauchbare Antwort zu bekommen

Verfasst: Montag 17. Dezember 2007, 19:45
von Leonidas
Die RGB-Werte der Pixel in den Zeilen bekommst du etwa so:
Code: Alles auswählen
import Image
def chunkize_lc(l, size):
iterator = iter(l)
lazy_values = [[iterator.next] * size for i in range(len(l) / size)]
return [[inner() for inner in outer] for outer in lazy_values]
img = Image.open('logo.gif')
rgb = img.convert('RGB')
lines = chunkize_lc(rgb.getdata(), rgb.size[0])
Nun ist `lines` eine Lise von Zeilen, diese wiederrum eine Liste von Pixeln, diese wiederrum ein 3-Tupel bestehend aus dem R, G und B-Wert des Pixels.
Naja, das kannst du jetzt verarbeiten wenn du magst - aber frag mich nicht wie.
Verfasst: Montag 17. Dezember 2007, 20:05
von BlackJack
Wenn die Daten sowieso mit `numpy`verarbeitet werden, ist es wahrscheinlich einfacher(?) und schneller das Bild in ein `numpy.array` um zu wandeln und die Spaltendaten dort mittels Slicing heraus zu holen und oder das Array zu transponieren und dann zu slicen.
Re: Unscharfe Bilder erkennen.
Verfasst: Dienstag 18. Dezember 2007, 09:00
von Carraia
CM hat geschrieben:Habe mal was in der Richtung gemacht, aber Du stellst leider keine konkrete Frage.
In der zweiten Zeile des ersten Beitrags.
Verfasst: Dienstag 18. Dezember 2007, 09:49
von BlackJack
Vielleicht solltest Du die Fragen die CM gestellt hat, um besser einschätzen zu können ob und wie er Dir weiterhelfen kann, auch noch beantworten.
Re: Unscharfe Bilder erkennen.
Verfasst: Dienstag 18. Dezember 2007, 10:11
von CM
Hoi,
Carraia hat geschrieben:In der zweiten Zeile des ersten Beitrags.
Da steht:
Carraia hat geschrieben:Ich suche einen Python-Code, der unscharfe bzw. Interlaced Bilder erkennen kann. Möglichst in Verbindung mit der PI-Bibliothek(PIL).
Ich schlußfolgere daraus, daß Du ein Codesnippet brauchst, um zu entscheiden, ob ein Bild unscharf ist. Das ist eine sehr ungewöhnliche Frage, daher habe ich vermutet, daß Du vielleicht etwas Anderes meinen könntest. "Unscharf" ist ein weites Feld, aber ich will eine Antwort versuchen.
Antwort auf diese Frage: Berechne eine Fouriertransformation Deiner Bilder, die Du zuvor in Graustufen umgewandelt hast. Quadriere die transformierten Werte. Ist der Amplitudenabfall assymmetrisch? Dann leidet das Bild unter Astigmatismus. Gibt es "Spikes"? Sehr wahrscheinlich interlaced. Um hierbei Artefakte zu vermeiden hilft es das Bild mit ein paar Pixeln am Rand zu versehen, die den durchschnittlichten Grauwert des Randes haben. Zurück zum Bild: Ränder hervorheben. Sind diese verwischt gegenüber dem Mittel der Randstärke aller Bilder (größerer Variationskoffizient?) Sehr wahrscheinlich ist das Bild unscharf. Einfacher und schneller zu programmieren sind Kreuzkorrelationen der aufeinanderfolgenden Bilder. Wie verhält sich der Korrelationskoeffizient mit der Zeit (bezogen auf den Vorgänger)? (Ggf. einen leichten Bandpassfilter nutzen.)
Mehr fällt mir gerade nicht ein. Vielleicht weiß ja jemand eine cleverere Lösung.
Beantwortet das Deine Frage?
Gruß,
Christian, SCNR