Anaglyphbilder auf der Festplatte finden

Du hast eine Idee für ein Projekt?
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

Ich möchte Anaglyphbilder auf meiner Festplatte finden. Gesucht ist also eine Funktion, die True bei einem A.bild und False bei keinem A.bild ausgibt.

Begonnen habe ich mit PIL.

Code: Alles auswählen

#!/usr/bin/env python

import Image, sys, ImageDraw, os, ImagePalette  

for infile in os.listdir("C:\Dokumente und Einstellungen\Nutzer\Desktop"):
  if '.jpg' in infile:
    im = Image.open(infile)
    print 'Name: %s, Farben: %s' % (infile, im.getcolors(16777216))
Ich wollte aus der Verteilung der Farben etwas erkennen, aber es scheint hier nichts charakteristisches für Anaglyphen zu geben.

Weitere Ideen?
Zuletzt geändert von Okzident am Dienstag 31. Mai 2011, 13:11, insgesamt 1-mal geändert.
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
BlackJack

Vielleicht geht es ja einigen wie mir die nicht wissen worum's geht: http://de.wikipedia.org/wiki/Anaglyph

@Okzident: Grundidee wäre vielleicht die beiden Farbfilter der Brille auf das Bild anzuwenden und zu schauen ob man dann zwei Bilder bekommt, die horizontal etwas verschoben sehr ähnlich sind.
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

BlackJack hat geschrieben:Vielleicht geht es ja einigen wie mir die nicht wissen worum's geht: http://de.wikipedia.org/wiki/Anaglyph

@Okzident: Grundidee wäre vielleicht die beiden Farbfilter der Brille auf das Bild anzuwenden und zu schauen ob man dann zwei Bilder bekommt, die horizontal etwas verschoben sehr ähnlich sind.
Wie sähe das im Code aus?
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

Wie gesagt, ich komme nicht weiter.
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Okzident hat geschrieben:Wie gesagt, ich komme nicht weiter.
Was hast Du denn in Bezug auf BlackJacks Tipps so probiert? Wo hakt es denn? Du könntest uns ja mal Code zeigen!

Ich formuliere mal frei, was ich denke: Das Thema hört sich durchaus schwierig an. Man muss das halt erst einmal algorithmisch verstanden haben. Die Umsetzung in Python ist dann sicherlich auch noch mal eine Schwierigkeit, weil man sich erst einmal in PIL und dessen Funktionalität einarbeiten muss. Solltest Du also weder algorithmisch noch von Deinen Python Kenntnissen angemessen vorgebildet sein, so ist die Aufgabe vielleicht eher ungeeignet für Dich?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

Code: Alles auswählen

#!/usr/bin/env python

import Image, sys, ImageDraw, os, ImageOps, ImageChops

for infile in os.listdir("C:\Dokumente und Einstellungen\Nutzer\Desktop"):
  if '.jpg' in infile:
    im = Image.open(infile)
    im = im.resize ((300, 300))
    blau = Image.new('RGB', (im.size[0],im.size[1]), (126,240,240))
    rot = Image.new('RGB', (im.size[0],im.size[1]), (246,96,97)) 
    teil1 = ImageChops.lighter(im, rot).convert("L")
    teil2 = ImageChops.lighter(im, blau).convert("L")
    #teil1 = ImageOps.autocontrast(teil1)
    #teil2 = ImageOps.autocontrast(teil2)
    diff = ImageChops.difference(teil2, teil1)
    diff.show()
    #print diff.getbbox()
    print 'Name: %s, Vergleich: %s, Echte Groesse: %s x %s' % (infile, diff.getbbox(),im.size[0],im.size[1])  
    
     
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So, ich habe den Code mal aufgearbeitet, damit er auch bei anderen funktioniert:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

import sys
import os
import Image
import ImageDraw
import ImageOps
import ImageChops


def filter_anaglyph(filename):
    size = (300, 300)
    im = Image.open(filename)
    im = im.resize(size)
    blue = Image.new('RGB', size, (126,240,240))
    red = Image.new('RGB', size, (246,96,97)) 
    part_red = ImageChops.lighter(im, red).convert("L")
    part_blue = ImageChops.lighter(im, blue).convert("L")
    #teil1 = ImageOps.autocontrast(teil1)
    #teil2 = ImageOps.autocontrast(teil2)
    diff = ImageChops.difference(part_blue, part_red)
    diff.show()
    #print diff.getbbox()
    print 'Name: %s, Vergleich: %s, Echte Groesse: %s x %s' % \
            (filename, diff.getbbox(),im.size[0],im.size[1])  


def main():
    filter_anaglyph(sys.argv[1])

    
if __name__ == "__main__":
    main()
Nun frage ich mich: Wo hakt es denn nun bei Dir? Welchen Schritt im Algorithmus vermisst Du? Was bekommst Du nicht hin? Denn durchlaufen tut der Code ja; also muss es ja nun noch beim Algo hapern.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

Hyperion, das Problem ist damit nicht gelöst. Was ich will ist doch ganz einfach. Ich will eine Funktion, die True oder False ergibt. True heißt, es ist ein Anaglyphbild, False heißt, es ist kein Anaglyphbild.

Die Frage, woran es hapert ist deplaziert, weil der Code dieses Ziel nicht erreicht.
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du stellst Dich irgend wie ungeschickt an - auch wenn Du neu im Forum bist!

Du musst uns doch mal präzise beschreiben, was Dein Script bisher tut und was noch nicht funktioniert. An welcher Stelle, des von BlackJacks vorgeschlagenen Algos hapert es? Welche Teile sind umgesetzt und bei welchen hast Du Probleme, das ganze in Python zu formulieren?

Du klatscht hier einfach Code rein - der nicht mal per se funktionstüchtig ist, da ein fest codierter Pfad enthalten war - ohne Kommentar, der prinzipiell eben durchläuft. Woher soll jemand hier wissen, was denn nun daran das Problem ist? Zudem hättest Du ja auch mal ein Bild als Referenz für Deine Tests angeben können. Ich habe mit dem oberen Bild aus dem Wiki-Artikel gearbeitet.

Um es mal deutlich zu sagen: Du willst Hilfe - da musst Du Dich auch anstrengen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

Ich stelle mich sogar sehr geschickt an indem ich dir die Nutzlosigkeit deiner Antwort aufzeige.

Ich muß Dir nichts beschreiben, wenn du nicht weißt, was ein Anaglyph ist dann machst du dich mit dem Link von BlackJack schlau und belästigst mich hier nicht. Was mein Script bisher tut hast du bereits erfahren, indem du schriebst, es läuft durch. Ich werde dir nichts beschreiben, was du vor Augen hast.

Du klatscht hier einfach sinnlos formatierten Code rein - der nicht mal eine funktionelle Änderung enthält. Das Problem wird so nur komplizierter. Zudem kann jeder ein Bild aus dem Wiki-Artikel nutzen.

Um es mal deutlich zu sagen: Du willst Antworten - da mußt Du Dich auch anstrengen - und das nicht nur im Ton sondern insbesondere im Nutzen deiner Antwort.

Ich bin nicht der einzige auf dieser Welt, der Anaglyphen aussortieren will.
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich geh' dann kurz mal Popcorn machen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

EyDu hat geschrieben:Ich geh' dann kurz mal Popcorn machen.
Bring mir auch eins mit.
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

EyDu hat geschrieben:Ich geh' dann kurz mal Popcorn machen.
Wegen mir nicht ;-) Ich bekomme heute Abend im Kino welches :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Okzident: Wenn Du nicht beschreibst worum es geht, dann werden viele sich nicht die Mühe machen es selbst heraus zu finden. Die Leute hier werden schliesslich nicht dafür bezahlt, dass sie sich mit Programmierproblemen von anderen Leuten befassen. Also sollte man ihnen das Nachvollziehen von Problemen durch Beschreibungen und lauffähigen Code möglichst einfach machen. Jedenfalls wenn man Antworten haben möchte.

Das Problem wird durch die Programmänderungen von Hyperion nicht komplizierter. Es ist doch immer noch genau das selbe Problem!?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Okzident hat geschrieben:Ich stelle mich sogar sehr geschickt an indem ich dir die Nutzlosigkeit deiner Antwort aufzeige.

Ich muß Dir nichts beschreiben, wenn du nicht weißt, was ein Anaglyph ist dann machst du dich mit dem Link von BlackJack schlau und belästigst mich hier nicht. Was mein Script bisher tut hast du bereits erfahren, indem du schriebst, es läuft durch. Ich werde dir nichts beschreiben, was du vor Augen hast.

Du klatscht hier einfach sinnlos formatierten Code rein - der nicht mal eine funktionelle Änderung enthält. Das Problem wird so nur komplizierter. Zudem kann jeder ein Bild aus dem Wiki-Artikel nutzen.
Wow, durch diese Antwort ist mein Anreiz zu helfen auf Null gesunken. Wenn man potentielle Helfer blöd anmacht, darf man nicht auf Hilfe hoffen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

BlackJack hat geschrieben:@Okzident: Wenn Du nicht beschreibst worum es geht
Ich habe beschrieben, worum es geht. Deine Vorschläge sind implementiert. Ich kann schlicht vorlaute Kinder wie Hyperion nicht tolerieren.
Das Problem wird durch die Programmänderungen von Hyperion nicht komplizierter.
Das Problem wird durch die Programmverzierungen von Hyperion komplizierter.
Wow, durch diese Antwort ist mein Anreiz zu helfen
Bei dir stört mich das nicht.
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Okzident hat geschrieben:
Das Problem wird durch die Programmänderungen von Hyperion nicht komplizierter.
Das Problem wird durch die Programmverzierungen von Hyperion komplizierter.
Na das musst Du uns aber mal erklären! Im Gegensatz zu Deiner Version habe ich lediglich diesen Pfad entschärft "C:\Dokumente und Einstellungen\Nutzer\Desktop", damit es jeder Benutzer hier im Forum einfach bei sich testen kann. Ok, ich habe einige Namen auf Englisch umgestellt, das ganze von Modulebene in eine Funktion verlagert und die `imports` PEP8 konform organisiert. Was macht das komplizierter? *wunder*
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

Hyperion hat geschrieben:Na das musst Du mir aber mal erklären!
Ich muß dir gar nichts erklären.
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
BlackJack

@Okzident: Wenn die Vorschläge implementiert sind, wo ist dann das Problem? Dann funktioniert ja jetzt alles.

Das Problem ändert sich durch Programmänderungen nicht. Es kann sein dass man neue Erkenntnisse gewinnt und man dadurch zu dem Schluss kommt, dass das Problem komplizierter oder einfacher lösbar ist als ursprünglich angenommen, aber das Problem selbst ist immer noch genau das selbe.

Wenn Du nur die Implementierung ohne weitere Erklärung zeigst, dann sieht man nur *was* Du gemacht hast, aber man weiss nicht *warum* Du das so gemacht hast. Ich sehe die Vorschläge durch den Quelltext zum Beispiel nicht implementiert. Es wird weder eine Verschiebung berücksichtigt, noch sehe ich wie ich das Ergebnis als Ähnlichkeit deuten sollte.

Du musst hier keinem was erklären — stimmt. Es muss sich aber auch niemand mit Deinen Problemen befassen.
Benutzeravatar
Okzident
User
Beiträge: 11
Registriert: Dienstag 31. Mai 2011, 09:25

BlackJack hat geschrieben:@Okzident: Wenn die Vorschläge implementiert sind, wo ist dann das Problem?
Nach diff = ImageChops.difference(teil2, teil1) habe ich in diff ein Bild, das den Unterschied zwischen rot und blau als Graustufenbild darstellt. Ich sehe aber kein deutliches Merkmal, das hilft zu unterscheiden ob es nun ein Anaglyphenbild ist oder nicht.
diff = ImageChops.difference(im, teil1) bringt auch kein deutlicheres Ergebnis.

Wie willst du den Unterschied zwischen zwei Bildern(teil1 & teil2) berechnen und ein Ergebnis haben? Letztlich ist - um die Verschiebung zu erkennen - ein Justierungsalgorithmus wie etwa bei autopano nötig, was meinst du?
Etwas Großes zum ersten Mal zu erleben ist unbezahlbar.
Antworten