2010-08-06 4 views
7

Ich mache einige Bildverarbeitungen und versuche, Punkte zu behalten, die denen unten eingekreisten Punkten ähneln, ein sehr dunkler Fleck von einigen Pixeldurchmessern mit allen benachbarten Pixel sind hell. Ich bin mir sicher, dass es Algorithmen und Methoden gibt, die dafür ausgelegt sind, aber ich weiß einfach nicht, was sie sind. Ich glaube nicht, dass die Kantenerkennung funktionieren würde, da ich nur die kleinen Spots möchte. Ich habe ein wenig über morphologische Operatoren gelesen, könnten diese ein geeigneter Ansatz sein?Wie erkenne ich Punkte, die sich drastisch von ihren Nachbarn unterscheiden?

Dank

wavelet filtered image

+0

Suchen Sie nur nach dunklen Punkten auf hellem Hintergrund oder auch gegenüber (helle Punkte auf dunklem Hintergrund)? –

Antwort

1

Persönlich mag ich dieses corner detection algorithms Handbuch.

Auch Sie können naiv ecke Erkennung Algorithmus trainieren, indem Sie die Idee, dass isoliert Pixel ist ein solches Pixel, durch die Intensität ändert sich drastisch in jede Richtung. Es ist nur eine anfängliche Idee, um von besseren Algorithmen zu profitieren.

+0

404 auf den Link jetzt, hier ist die Wikipedia-Seite für die Ecke Erkennung (ich habe keine Möglichkeit zu wissen, ob es ähnliche Informationen zu den verlinkten Artikel abdeckt): https: // en. wikipedia.org/wiki/Corner_detection – dtudury

5

Schleife über Ihr jedes Pixel in Ihrem Bild. Wenn Sie ein Pixel betrachtet haben, markieren Sie es als "verwendet" (ändern Sie es zu einem bestimmten Wert oder halten Sie diese Daten in einem separaten Array parallel zum Bild).

Wenn Sie auf ein dunkles Pixel stoßen, führen Sie eine flood-fill darauf aus, markieren Sie alle diese Pixel als "verwendet" und verfolgen Sie, wie viele Pixel ausgefüllt wurden. Achten Sie während der Flutfüllung auf das Pixel Sie denken, dass es nicht dunkel ist, dass es ausreichend hell ist.

Nach der Flutfüllung wissen Sie die Größe des dunklen Bereichs, den Sie ausgefüllt haben, und ob der Rand der Füllung ausschließlich helle Pixel waren. Fahren Sie nun mit der Originalschleife fort und überspringen Sie "gebrauchte" Pixel.

+0

Das ist ein netter Ansatz, ich werde es versuchen – Simonw

2

Sind Sie sicher, dass Sie keine Kantenerkennung durchführen möchten? Es scheint, als würde ein Vergleich des aktuellen Pixels mit dem Durchschnittswert der Nachbarschaftspixel den Trick machen. (Ich würde verschiedene Nachbarschaftsgrößen auswerten, um sicher zu sein.)

0

Es ist ein paar Jahre her, seit ich irgendeine Bildverarbeitung machte. Aber ich würde wahrscheinlich damit beginnen, in eine binäre Darstellung zu konvertieren. Es scheint nicht so, als ob du dich für die grauen Mittelwerte interessierst, nur die sehr dunklen/sehr hellen Regionen, also werde das Grau los. An diesem Punkt können verschiedene morphologische Operationen die Punkte, an denen Sie interessiert sind, akzentuieren. Öffnen und Schließen sind ziemlich einfach zu implementieren und können ziemlich schöne Ergebnisse liefern, so dass Sie überall ein schwarzes Feld haben, mit Ausnahme der Punkte, an denen Sie interessiert sind.

3

Wie wäre es mit einer Median-Filterung? Nehmen Sie Werte von 3 * 3 Gitter (oder einer anderen geeigneten Größe) um das Pixel herum und stellen Sie den Wert des Pixels auf den Median dieser 9 Pixel ein.

Dann, wenn die meisten der Nachbarn hell sind die Pixel wird hell usw.

Edit: Nach einiger Überlegung, erkannte ich, dass dies die Ausreißer nicht erkennen kann, wird sie entfernen. Das ist also nicht die Lösung, die das ursprüngliche Poster verlangte.

1

Ich werde wirklich einfache Vorlage vorschlagen passend dazu, wenn alle Ihre Features ungefähr gleich groß sind.

Kopieren Sie einfach die Pixel eines (oder einiger Features), um wenige Vorlagen zu erstellen, und verwenden Sie dann Normalisierte Kreuzkorrelation oder einen anderen Wert, den OpenCV in seinen Vorlagenabgleichroutinen zur Verfügung stellt, um ähnliche Bereiche zu finden.Im Ergebnis, erfassen Sie alle maximalen Spitzen der Antwort (OpenCV hat auch eine Funktion), und das sind Ihre Feature-Koordinaten.

0

Haben Sie versucht, verbundene Komponenten mit cvContours zu extrahieren? Zuerst das Bild mit dem Schwellenwert vergleichen (mit der Methode von Otsu) und dann jede Kontur extrahieren. Da die Spots, die Sie verfolgen möchten (etwas, was ich in Ihrem Bild sehe) etwas isoliert von der Nachbarschaft sind, werden sie einige als separate Konturen haben. Wenn wir nun die Fläche des begrenzenden Rechtecks ​​jeder Kontur berechnen und die größeren herausfiltern, würden wir nur kleine Punkte haben, die von dunklen Nachbarn getrennt sind. Wie bereits angedeutet, sollte ein bisschen morphologisches Basteln vor der Konturtrennung zu guten Ergebnissen führen.

0

Blur (3x3) eine Kopie von Ihrem Bild dann Diff Ihr Originalbild. Die Pixel mit den höchsten Werten unterscheiden sich am stärksten von ihren Nachbarn. Dies könnte als Kantenerkennungsalgorithmus verwendet werden, aber Punkte sind wie Superkanten, also setzen Sie Ihre Schwelle höher.

what a single off pixel looks like: 
(assume surrounding pixels are all 1) 

original blurred   diff 
1,1,1  8/9,8/9,8/9  1/9,1/9,1/9 
1,0,1  8/9,8/9,8/9  1/9,8/9,1/9 
1,1,1  8/9,8/9,8/9  1/9,1/9,1/9 


what an edge looks like: 
(assume surrounding pixels are the same as their closest neighbor) 

original blurred   diff 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9 
Verwandte Themen