2013-06-13 6 views
23

Für Bild Derivat Berechnung sieht Sobel-Operator auf diese Weise:Warum Sobel Betreiber so aussieht?

[-1 0 1] 
[-2 0 2] 
[-1 0 1] 

ich nicht ganz 2 Dinge verstehen darüber,

1.Why das mittlere Pixel ist ? Kann ich nicht einfach einen Operator wie unten verwenden,

[-1 1] 
[-1 1] 
[-1 1] 

2.Warum ist die mittlere Reihe 2 mal die anderen Reihen?

Ich googelte meine Fragen, fand keine Antwort, die mich überzeugen kann. Bitte hilf mir.

Antwort

47

In der Computer Vision gibt es oft keine perfekte, universelle Art, etwas zu tun. Meistens versuchen wir einfach einen Operator, sehen seine Ergebnisse und prüfen, ob sie unseren Anforderungen entsprechen. Auch für die Gradientenberechnung gilt: Der Sobel-Operator ist eine von vielen Möglichkeiten, einen Bildgradienten zu berechnen, der sich in vielen Anwendungsfällen bewährt hat.

In der Tat, desto einfacher Gradientenoperators wir noch einfacher als das man denken könnte vorschlagen, dass Sie über:

[-1 1] 

Trotz seiner Einfachheit hat dieser Operator ein erstes Problem: Wenn Sie es verwenden, Sie berechnen der Gradient zwischen zwei Positionen und nicht um eine Position. Wenn Sie es auf 2 Pixel (x,y) und (x+1,y) anwenden, haben Sie den Farbverlauf an Position (x,y) oder (x+1,y) berechnet? In der Tat, was Sie berechnet haben, ist der Farbverlauf an der Position (x+0.5,y), und die Arbeit mit halben Pixeln ist nicht sehr praktisch. Deshalb haben wir eine Null in der Mitte hinzu:

[-1 0 1] 

Anwenden dieses zu Pixel (x-1,y), (x,y) und (x+1,y) werden Sie eindeutig einen Gradienten für das mittlere Pixel geben (x,y).

Dieser kann auch als die Faltung von zwei [-1 1] Filter gesehen werden: [-1 1 0] dass die Steigung an der Position (x-0.5,y), auf der linken Seite des Pixels berechnet, und [0 -1 1], die an der rechten Seite des Pixels des Gradienten berechnet.

Jetzt hat dieser Filter noch einen weiteren Nachteil: Er ist sehr rauschempfindlich. Deshalb entscheiden wir nicht, dass es auf einer einzigen Zeile von Pixeln anzuwenden, sondern auf drei Reihen: dies ermöglicht eine durchschnittliche Steigung auf diesen drei Zeilen zu erhalten, die mögliche Geräusch erweichen:

[-1 0 1] 
[-1 0 1] 
[-1 0 1] 

Aber dieses neigt dazu, durchschnittliche Dinge ein wenig zu viel: Wenn sie auf eine bestimmte Zeile angewendet werden, verlieren wir viel von dem, was das Detail dieser bestimmten Zeile macht. Um das zu beheben, wollen wir der mittleren Zeile etwas mehr Gewicht geben, was uns erlaubt, mögliches Rauschen zu eliminieren, indem wir berücksichtigen, was in den vorherigen und nächsten Zeilen passiert, aber immer noch die Spezifität dieser Zeile beibehalten.Das ist, was das Sobel-Filter gibt:

[-1 0 1] 
[-2 0 2] 
[-1 0 1] 

mit den Koeffizienten Manipulieren zu anderen Gradientenoperatoren wie die Scharr Betreiber führen kann, was nur ein wenig mehr Gewicht der mittleren Reihe gibt:

[-3 0 3 ] 
[-10 0 10] 
[-3 0 3 ] 

Es gibt auch mathematische Gründe dafür, wie die Trennbarkeit dieser Filter ... aber ich bevorzuge es als experimentelle Entdeckung zu sehen, die interessante mathematische Eigenschaften bewiesen haben, wie Experiment meiner Meinung nach im Herzen der Computer Vision ist . Nur Ihre Phantasie sind keine Grenzen gesetzt, neue zu schaffen, so lange wie es Ihren Bedürfnissen passt zu ...

+0

Vielen Dank für diese detaillierte Antwort. – Alcott

+1

* "Nur deiner Vorstellungskraft ist die Grenze, um neue zu schaffen, solange es deinen Bedürfnissen entspricht ..." * - +1. – rayryeng

14

EDIT Der wahre Grund, dass der Sobel-Operator kann auf diese Weise durch das Lesen an interesting article by Sobel himself finden werden aussieht. Mein Schnelles Lesen dieses Artikels zeigt an, dass Sobels Idee war, eine verbesserte Schätzung des Gradienten zu erhalten, indem man die horizontalen, vertikalen und diagonalen zentralen Unterschiede der Durchschnitt, durchschnitt. Wenn nun der Gradient in vertikale und horizontale Komponenten zerlegt wird, sind die diagonalen zentralen Unterschiede in beiden enthalten, während die vertikalen und horizontalen zentralen Unterschiede nur in einem enthalten sind. Zwei vermeiden Doppel Zählen der Diagonalen sollte daher die Hälfte der Gewichte der vertikal und horizontal haben. Die tatsächlichen Gewichte von 1 und 2 sind nur bequem für Festpunktarithmetik (und enthalten tatsächlich eine Skala Faktor von 16).

Ich stimme meistens mit @mbrenon, aber es gibt ein paar Punkte zu schwer, um in einem Kommentar zu machen.

Zuerst in der Computer Vision, verschwendet der Ansatz "Meistens, wir versuchen nur einen Operator" nur Zeit und liefert schlechte Ergebnisse im Vergleich zu dem, was erreicht worden sein könnte. (Das heißt, ich mag auch zu experimentieren.)

Es ist wahr, dass ein guter Grund, [-1 0 1] zu verwenden ist, dass es die abgeleitete Schätzung auf dem Pixel zentriert. Aber ein weiterer guter Grund ist, dass es die central difference Formel ist, und Sie können mathematisch beweisen, dass es einen niedrigeren Fehler in seinem estmate des wahren Derivats gibt als [-1 1].

[1 2 1] wird verwendet, um Geräusche als mbrenon zu filtern, sagte. Der Grund, warum diese bestimmten Zahlen gut funktionieren, ist, dass sie eine Approximation eines Gaußschen Filters sind, der der nur Filter ist, der keine Artefakte einführt (obwohl aus Sobels Artikel dies ein Zufall zu sein scheint). Wenn Sie nun das Rauschen reduzieren möchten, suchen Sie nach einer horizontalen Ableitung, die Sie in vertikaler Richtung filtern möchten, um die Schätzung des Derivats so gering wie möglich zu halten. Convolving mit [-1 0 1] wir bekommen den Sobel-Operator. d. h .:

[1]   [-1 0 1] 
[2]*[-1 0 1] = [-2 0 2] 
[1]   [-1 0 1] 
+0

Danke für das Zitat! –

2

Für 2D-Bild benötigen Sie eine Maske. Say Diese Maske ist:

[ a11 a12 a13; 
    a21 a22 a23; 
    a31 a32 a33 ] 

Df_x (Gradient entlang x) sollte aus Df_y (Gradient entlang y) erzeugt werden, durch eine Rotation von 90o, d.h.die Maske sein soll:

[ a11 a12 a11; 
    a21 a22 a21; 
    a31 a32 a31 ] 

Nun, wenn wir das Signal vor dem mittleren Pixel (das ist, was die Differenzierung ist in diskreten - Subtraktion) subtrahieren wollen wir wollen zuzuteilen gleiche Gewichte auf beiden Seiten der Subtraktion, dh unsere Maske wird:

[ a11 a12 a11; 
    a21 a22 a21; 
    -a11 -a12 -a11 ] 

als nächstes wird die Summe des Gewichts sollte Null sein, weil, wenn wir ein glattes Bild haben (zB alle 255s) haben wir eine Null-Antwort haben wollen, das heißt, wir bekommen:

[ a11 a12 a11; 
    a21 -2a21 a21; 
    -a31 -a12 -a31 ] 

Im Falle eines glatten Bildes erwarten wir die Differenzierung entlang der X-Achse Null zu erzeugen, das heißt:

[ a11 a12 a11; 
    0 0 0; 
    -a31 -a12 -a31 ] 

Schließlich, wenn wir normalisieren erhalten wir:

[ 1 A 1; 
    0 0 0; 
    -1 -A -1 ] 

und Sie von A bis alles einstellen können Sie will experimentell. Ein Faktor von 2 ergibt den ursprünglichen Sobel-Filter.

Verwandte Themen