Beispiel1 - Blackbox - Verständnisfragen

  • tip von mir für Bob:
    das von DDoS beschriebene Testbild als 1-Kanal hochladen, im Matlab dann die entstehende matrix im Variable Editor öffnen, die Kernelgröße bestimmen, mit fspecial('gaussian'...) das sigma annähern. Damit ist bei mir laut Zwischenbewertung ein richtiges Sigma rausgekommen, auch wenn die Werte der von Matlab erzeugten Filtermatrix nicht 100% mit dem Ergebnis der Blackbox übereinstimmt.

  • Code
    1. %in - image before filter
    2. %out- image after evc filter
    3. clear
    4. in = im2uint16(imread('jin.jpg'));
    5. ...


    ...


    Bitte keinen Code posten, sonst müssen wir das Forum schließen.
    Desweiteren ist nicht unbedingt sinnvoll die Parameter zu erraten, sondern manchmal einfacher sich ein gutes Testbild zu überlegen und dann kriegt man den Filter sehr einfach. Schau einmal in die Folien nach, von der Beispielsammlung. Stichwort: Kernelantwort

    Michael Beham
    Computer Vision WS 2012/13
    Einführung in Visual Computing SS2012, SS2013


  • EDIT2:
    durch hochladen eines schwarzen bildes mit weißem pixel in der mitte habe ich geglaubt eine kernelgröße von 7 feststellen zu können, weil die pixel im ausgabe bild die mehr als 3 schritte vom mittlersten pixel entfernt waren alle null sind.. kann es trotzdem sein das der kernel größer ist, und ein paar pixel nur durch rundungsfehler 0 sind ? also vll. eine kernelgröße von 9 möglich wäre?


    Ja das kann sein.

    Ines Janusch
    -------------------------
    EVC Tutorin 2014

  • Ich hätte eine Frage was die Genauigkeit bei Angabe der Blackbox angeht:


    Angenommen, ich stoße auf das Unsharp Masking Verfahren:
    Man kann ja mit Hilfe von Matlab aus Ein- und Ausgabebild das geglättete Bild herausheben, welches in weiterer Folge vom Eingabebild subtrahiert wird. Muss man dann herausfinden, welche Glättung beim Unsharp Masking angewandt wurde? Oder soll man die Parameter angeben, die in gängigen Bildbearbeitungsprogrammen angegeben werden können, also Stärke, Radius und Schwellwert?


    Hallo, ich steh grad beim Unsharp Masking an.. Ich bin mir sicher das es sich bei diesem Filter um dieses Verfahrn handelt nur weiß ich nicht wie ich die Parameter bestimmen soll und ich versteh auch ned was du mit herausheben meinst... Vl kann mir jemand weiterhelfen
    Danke

  • ...soll und ich versteh auch ned was du mit herausheben meinst...


    Schau dir die Abbildung im Skriptum auf Seite 42 unten an. Falls du es mit Unsharp Masking zu tun hast, hast du das Eingabebild f(x,y) und das Ausgabebild fsharp(x,y) gegeben. Das ist genug, dass du dir alle anderen Zwischenbilder berechnen kannst. Bei jedem Knoten in der Abbildung wird etwas dazuaddiert/subtrahiert, du brauchst also nur die jeweiligen Formeln umformen und berechnen (ist in Matlab schnell erledigt) ^^

  • Nun versuche die Formel nach der Unbekannten aufzulösen.


    Wie soll man bei Unsharp Masking nach DER Unbekannten auflösen? das Problem ist doch, dass man 2 Unbekannte hat: k und fsmooth (und für fsmooth hat man auch wieder versch. Methoden, Kernelgrößen,...) , d.h. ich kann nur jeweils eine raten und dann versuchen die andere zu bestimmen, aber irgendwie bin ich so bisher nicht weitergekommen. Kernelgröße und Glättungsmethode glaub ich mittlerweile herausgefunden zu haben, aber die sonstigen Parameter wüsste ich echt nicht systematisch zu bestimmen

  • Wie soll man bei Unsharp Masking nach DER Unbekannten auflösen? das Problem ist doch, dass man 2 Unbekannte hat: k und fsmooth (und für fsmooth hat man auch wieder versch. Methoden, Kernelgrößen,...) , d.h. ich kann nur jeweils eine raten und dann versuchen die andere zu bestimmen, aber irgendwie bin ich so bisher nicht weitergekommen. Kernelgröße und Glättungsmethode glaub ich mittlerweile herausgefunden zu haben, aber die sonstigen Parameter wüsste ich echt nicht systematisch zu bestimmen


    k hätte man zwar ursprünglich auch bestimmen sollen - aber nach dem es schon ein paar Mal erwähnt wurde hier im Forum k=1.

    Ines Janusch
    -------------------------
    EVC Tutorin 2014

  • bin gerade dabei eve zu lösen,
    was ich bisher rausgefunden habe: die 3 farbkanäle werden einzeln behandelt, und jedes pixel wird mit einem eigenen 3x3 kernel gefaltet, der kernel ist abhängig von der position und unabhängig von der bildgröße, weiters gibt es keine negativen parameter in den kernels
    kann das jemand bestätigen, hat eve schon jemand gelöst?


    zusätzliche frage an die tutoren:
    ich bin in der lage alle kernels zu rekonstruieren, aber ich finde keine formel bzw. ein wiederholendes muster mit dem ich den kernel einer bestimmten position berechnen kann, ist es eine gültige lösung ein matlab skript zu schreiben dass alle kernels durch einen lookup table bestimmt? .. durch die maximal hochladbare bildgröße hab ich ja eine begrenzte anzahl an kernels die ich benötigen würde


  • zusätzliche frage an die tutoren:
    ich bin in der lage alle kernels zu rekonstruieren, aber ich finde keine formel bzw. ein wiederholendes muster mit dem ich den kernel einer bestimmten position berechnen kann, ist es eine gültige lösung ein matlab skript zu schreiben dass alle kernels durch einen lookup table bestimmt? .. durch die maximal hochladbare bildgröße hab ich ja eine begrenzte anzahl an kernels die ich benötigen würde


    ich kann mir ehrlich gesagt nicht vorstellen, dass das zum ziel/zur lösung führt...

    Ines Janusch
    -------------------------
    EVC Tutorin 2014

  • Verstehe ich das richtig?
    Ich weiß, dass einer der Filter ein Gaußfilter ist. Wenn ich also z.B. ein schwarzes 9x9-Bild mit 8 bit und einem einzelnen weißen Pixel in der Mitte hochlade, ist das, was mir die Blackbox herausgibt, der Kernel. Jetzt muss ich nur noch schauen, dass ich mit "bla = fspecial('gaussian',[3 3],sigma) * 255" (3x3, wenn im Ausgabe-Bild 3x3 Pixel in der Mitte verändert sind?) genau das gleiche wie im Ausgabebild herausbekomme?
    Ich hänge da jetzt schon seit über einer halben Stunde dran, das Sigma richtig anzupassen und habe das mittlere Pixel endlich mit Sigma auf den Wert 64 (ist bei mir im Ausgabebild eben 64) gebracht, allerdings hat Sigma jetzt 6 Nachkommastellen und bei den anderen 8 Pixeln stimmt es um 0,2xxx auch nicht.
    Ist also doch nicht die richtige Methode oder was mache ich falsch?

  • Juleru bei einem 9x9 Bild pfuscht dir die Randbehandlung wohl hinein, probiers mal wenn du jeweils am Rand ceil(Kernelsize/2) oder gleich Kernelsize Pixel abstand lässt... ansonsten gibt es eine Formel mit der du aufgrund des mittleren Kernelpixels dir das sigma für einen gauss berechnen kannst.
    Stimmt der Matlab-Gauss mit dem errechneten wert nicht mit deinem Kernel überein, ist's kein gauss.

    Wo sind nur die Zeiten hin, als die Leute noch auf den Danke-Button geklickt haben...

  • 1. es ist der Kernel gespiegelt
    2. 8bits erfassen nur Koeffizienten größer als 0,004. Es kann duraus sein, dass eine ganze Reihe oder Spalte alle Kernelelemente kleiner als 0,004 hat!
    3. 64 für Sigma ist voll daneben... verwendest du die Formel richtig?

    Of course I don't see textures as images. Who would?


    Einführung in Visual Computing VU Übungsleiter 2012
    Visualisierung LU Tutor 2005-2007

  • Juleru bei einem 9x9 Bild pfuscht dir die Randbehandlung wohl hinein, probiers mal wenn du jeweils am Rand ceil(Kernelsize/2) oder gleich Kernelsize Pixel abstand lässt... ansonsten gibt es eine Formel mit der du aufgrund des mittleren Kernelpixels dir das sigma für einen gauss berechnen kannst.
    Stimmt der Matlab-Gauss mit dem errechneten wert nicht mit deinem Kernel überein, ist's kein gauss.

    Die Randbehandlung betrifft doch nur die Pixel ganz am Rand, aber wenn ich in der Ausgabe nur Grauwerte zwischen (4,4) und (6,6) habe (mit (5,5) als dem ursprünglich weißen Pixel), kann da doch theoretisch nichts passieren, oder?
    Ein Medianfilter oder Mittelwertfilter ist es nicht, also kann es nur ein Gaussfilter sein.


    1. es ist der Kernel gespiegelt
    2. 8bits erfassen nur Koeffizienten größer als 0,004. Es kann duraus sein, dass eine ganze Reihe oder Spalte alle Kernelelemente kleiner als 0,004 hat!
    3. 64 für Sigma ist voll daneben... verwendest du die Formel richtig?

    1. Gespiegelt oder nicht, ist bei diesem einen egal. Ansonsten in welchem Sinn? "i h g" (und genauso runter) oder einfach "c b a"?
    2. Oh, das wäre dann wirklich blöd und würde das erklären. Mit 16bit-Bildern habe ich es auch schon versucht, da aber die Blackboxes immer nur 8bit-Bilder ausgibt, hilft mir das doch eigentlich nichts. Wie wandelt man eigentlich 8bit- in 16-bit Bilder um?
    3. Nein, 64 ist nur der Grauwert, der mein mittlerer Pixel in der Ausgabe hatte. Mein Sigma wäre 0,8xxxxx.
    Aber ist das Vorgehen oben theoretisch richtig?

  • Die Randbehandlung betrifft doch nur die Pixel ganz am Rand, aber wenn ich in der Ausgabe nur Grauwerte zwischen (4,4) und (6,6) habe (mit (5,5) als dem ursprünglich weißen Pixel), kann da doch theoretisch nichts passieren, oder?
    Ein Medianfilter oder Mittelwertfilter ist es nicht, also kann es nur ein Gaussfilter sein.


    1. Gespiegelt oder nicht, ist bei diesem einen egal. Ansonsten in welchem Sinn? "i h g" (und genauso runter) oder einfach "c b a"?
    2. Oh, das wäre dann wirklich blöd und würde das erklären. Mit 16bit-Bildern habe ich es auch schon versucht, da aber die Blackboxes immer nur 8bit-Bilder ausgibt, hilft mir das doch eigentlich nichts. Wie wandelt man eigentlich 8bit- in 16-bit Bilder um?
    3. Nein, 64 ist nur der Grauwert, der mein mittlerer Pixel in der Ausgabe hatte. Mein Sigma wäre 0,8xxxxx.
    Aber ist das Vorgehen oben theoretisch richtig?


    2. Nein, auf ein 16bit bild kommt immer eine 16bit Antwort. 8bit Bilder auf 16bit umzuwandeln hilft nicht immer. Im Fall von einem weißen Pixel hilft es aber schon. 16bit Bilder lassen sich mit Matlab leicht erstellen ("Martin Blackbox" Beispiel), aber es geht auch mit Java, C#, etc.
    3. Es hat einige Fehler. Der erste wäre, dass es sich um einen Gaußfilter handelt ;) Bestimme doch erst die ganze Matrix!

    Of course I don't see textures as images. Who would?


    Einführung in Visual Computing VU Übungsleiter 2012
    Visualisierung LU Tutor 2005-2007

  • Hmm... hatte gedacht dass ich harry schon richtig hatte und hab vorher nochmals ein Bild zur Sicherheit raufgeladen und siehe da -> fail,
    obwohl ich bei 2 anderen bildern schon einen 100%-igen match hatte :(
    Kann mir da vielleicht jemand einen Tipp geben?

  • 2. Nein, auf ein 16bit bild kommt immer eine 16bit Antwort. 8bit Bilder auf 16bit umzuwandeln hilft nicht immer. Im Fall von einem weißen Pixel hilft es aber schon. 16bit Bilder lassen sich mit Matlab leicht erstellen ("Martin Blackbox" Beispiel), aber es geht auch mit Java, C#, etc.
    3. Es hat einige Fehler. Der erste wäre, dass es sich um einen Gaußfilter handelt ;) Bestimme doch erst die ganze Matrix!

    2. Da lief wohl beim einfügen in Matlab etwas schief (Doppelklick liefert 8bit-Bild, rüberziehen belässt es bei 16bit). Erstellt habe ich die Bilder eh auch mit Matlab.
    3. Wie, der Fehler ist, dass es ein Gaussfilter ist? Es ist ganz sicher irgendetwas, das das Bild glättet, also kommen nur Media-, Mittelwert- und Gaussfilter in Frage und die ersten beiden konnte ich durch ausprobieren schon ausschließen.
    Ist der Kernel nicht genau die Matrix?
    Bin jetzt durch ausprobieren (genau wie vorher) auf drei andere mögliche Sigmas gekommen (0.84xxx), aber wie wende ich das jetzt genau auf mein ursprüngliches Bild an? Mit "abc = imnoise(urspruenglich, 'gaussian', beliebig, 0.84xxx)" liefert es immer etwas total Anderes (für "beliebig" kann ich auch keine Matrix einsetzen) und so etwas wie "abc = urspruenglich * kernel" (wobei kernel = fspecial('gaussian',[3 3],0.84xxx)* 65536) funktioniert sowieso nicht.


    Das kann doch nicht sein, dass es nirgends eine vernünftige Dokumentation oder eine Wiki gibt (das Skriptum bringt sowieso nichts)! Ich dachte schon, POV-Ray hätte schlechte Erklärungen (und das hat eine Wiki!), aber mit Matlab ist man doch noch mieser dran!



    Edit:
    Wie bekomme ich bei Matlab genau so etwas wie diesen Filter d hin?
    Mit Kernelgröße [3 3] und "fspecial('gaussian'.....)" haut es bei meinem nur mit x-Nachkommastellen hin und das kann's wohl nicht sein, da gesagt wurde, dass es max. 1 Nachkommastelle gibt. Oder sagen wir so: Das n auf dem Bild erhält man, indem man alles aus der Matrix addiert, aber wo benutze ich dieses n in Matlab?


  • 3. Wie, der Fehler ist, dass es ein Gaussfilter ist? Es ist ganz sicher irgendetwas, das das Bild glättet, also kommen nur Media-, Mittelwert- und Gaussfilter in Frage


    Es gibt noch andere Glättungsverfahren. Zwei andere sind im Skriptum auf Seite 48/49 beschrieben