Unscharfe Bilder erkennen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Carraia
User
Beiträge: 10
Registriert: Samstag 15. Dezember 2007, 17:35

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.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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 :oops:

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.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Carraia
User
Beiträge: 10
Registriert: Samstag 15. Dezember 2007, 17:35

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.
Carraia
User
Beiträge: 10
Registriert: Samstag 15. Dezember 2007, 17:35

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 ?
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.
Carraia
User
Beiträge: 10
Registriert: Samstag 15. Dezember 2007, 17:35

Was ist eine Pixelspalte ?

Wie sieht deine Idee in Python aus (Beispiele) ?
BlackJack

Na eine Spalte mit Pixeln aus dem Bild halt. Bzw. die Werte eines der Känale (RGB) in einer Spalte in dem Bild.
Carraia
User
Beiträge: 10
Registriert: Samstag 15. Dezember 2007, 17:35

Wie sieht deine Idee in Python aus (Beispiele) ?
BlackJack

Ich weiss ja nicht einmal ob es funktioniert, da habe ich jetzt keine Lust Experimente zu machen.
Carraia
User
Beiträge: 10
Registriert: Samstag 15. Dezember 2007, 17:35

Das kann ich dir auch nicht sagen, denn ich kann dir nicht folgen.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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 ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Carraia
User
Beiträge: 10
Registriert: Samstag 15. Dezember 2007, 17:35

nkoehring, was ich kann und nicht kann überläßt du mir. Schließlich bist du es, der seine Prüfungen schiebt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Also ich sehe keine angreifende Haltung in meinem Text... in deinem schon. Vielleicht hast du etwas falsch aufgefasst?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Carraia
User
Beiträge: 10
Registriert: Samstag 15. Dezember 2007, 17:35

CM hat geschrieben:Habe mal was in der Richtung gemacht, aber Du stellst leider keine konkrete Frage.
In der zweiten Zeile des ersten Beitrags.
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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Antworten