Image displacement



  • Hi, guck mir gerade image displacement von http://www.flashandmath.com/intermediate/sub/sub.html an. Was ich aber nicht verstehe ist, wie ich aus den graustufen verschiebungsvektoren bekomme und in welche richtung diese zeigen. Im beispiel machen die das mit einer fertigen klasse... ich würde aber zum Verständnis ganz gerne per hand machen 🙂



  • imäging! schrieb:

    Was ich aber nicht verstehe ist, wie ich aus den graustufen verschiebungsvektoren bekomme und in welche richtung diese zeigen.

    Ohne mir das Teil jetzt angeschaut zu haben würd ich mal drauf tippen dass die den Gradienten des Grauwertbildes als Verschiebungsvektor verwenden...



  • Uh, hört sich schonmal gut an da ich keine Ahnung hab, was das ist *g*. Ich werd mich mal schlau machen, danke für den tip 🙂



  • So hab mich da mal ein wenig eingelesen, aber so ganz schlau werd ich daraus noch nicht. Der Gradient ist also der intensitätsunterschied zwischen zwei pixeln, ok.

    Ganz blöd kann man das also so berechnen?!

    for (int x = 0; x < image.width - 1; x++)
    {
    	for(int y = 0; y < image.height - 1; y++)
    	{
    		// hab das von da: http://www.seas.upenn.edu/~cse399b/Lectures/CSE399b-04-edge.pdf
    		// bin mir aber nicht ganz sicher das richtig verstanden zu haben
    		// ich nehm also ein pixel, davon irgendeinen channel (ist ja grayscale)
    		// und rechne das so wie im paper zusammen.
    		double gradient = 0.5 * ( 
    			(image(x, y + 1).R / 255) - 
    			(image(x, y).R / 255) + 
    			(image(x + 1, y + 1).R / 255) - 
    			(image(x + 1, y).R / 255));
    	}
    }
    

    Wenn ich das Ergebnis wieder auf 0-255 erweiter und ins bild schreibe sieht das auch halbwegs plausibel aus, aber ein wenig... matt?!
    http://www.abload.de/img/cat_mattwojy.png http://www.abload.de/img/cat_wikimrp2.png (das zweitere is von wikipedia)

    Ok, dann hab ich versucht einen richtungsvektor daraus zu errechnen, das sah auch nicht total falsch aus, aber auch nicht wirklich richtig 😃
    Gemacht hab ich das nach: http://en.wikipedia.org/wiki/Sobel_operator#Formulation
    Bin mir aber nichtmal sicher ob ich das darf, weil ist ja sobel und so 😃 (wobei der doch eigentlich auch nur den gradienten ausrechnet oder? Da versteh ich aber noch weniger wie)
    Im code sah das so aus

    Vector3D g = GetGradient(img.x, img.y);
    double dir = Math.atan2(g.x, g.y);
    Vector3D pos = new Vector3D(Math.sin(dir), Math.cos(dir));
    double len = Math.sqrt(g.x * g.x + g.y * g.y);
    

    hab ich da generell noch was missverstanden und es war glück das das (halbwegs) richtig aussah? ^^

    Gruß



  • Oh was ich vergessen hab zu sagen, ich hab den gradienten für x und y ausgerechnet, nur im beispiel oben jetzt weggelassen.



  • Ok, ich hatte (zumindest dachte ich das) das ganze einfachheits halber in as3 gebaut. War wohl ein großer fehler, den einfacher wurde das nicht wirklich und scheinbar haben sich auch einige fehler eingeschlichen. Hab das ganze jetzt nochmal in c# gebaut und es scheint so zu funktionieren wie man sich das erhofft.
    Original - x gradient - y gradient (oder umgedreht ^^) - vektoren
    Die vektoren wurden nur nicht für jedes pixel gezeichent, daher "fehlen" einige stellen.
    http://www.abload.de/img/gradient_convolution_s2s5u.png
    Jetzt noch das bild "verschieben" 🙂



  • Ok es geht 🙂 (vorsicht, groß) http://www.abload.de/img/gradientrnvk.png

    Eigentlich hab ich alles so gemacht wie geplant, nur halt nochmal neugebaut. Ich weiss jetzt nicht mehr wo der Fehler war aber ist ja auch egal, es geht 🙂
    Das einzige was ich noch zusätzlich gemacht hab ist bei endbild für den lookup der vektoren linear zu interpolieren, sonst sieht das einfach doof aus. Ansonsten ist alles so wie im verlinkten paper (also das gradient ausrechnen). Und für die Länge sowie rotation kann man die formeln aus dem verlinkten sobel beispiel nehmen (atan2 nehmen für die umrechnung).

    Falls jemand das c# beispiel will einfach schreiben dann lad ichs nochmal irgendwo hoch.

    Gruß
    Jakob


Anmelden zum Antworten