2012-08-29 9 views
5

Meine Frage ist einfach. Es könnte zu einfach sein. Aber die Sache ist, während ich an einem meiner Projekte arbeitete, benutzte ich die folgenden Zeilen, um ein Binärbild zu erweitern.Führt zwei morphologische Dilatation mit 3x3 strukturierenden Element gleich einem mit 6x6 Strukturelement durch?

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2); 

Das ist im Grunde erweitern das binäre Bild mit einem 3x3 rechteckigen strukturierenden Element. Aus dem letzten Argumente können Sie mir Durchführung 2 Wiederholungen dieser Operationen sehen, was gleichbedeutend ist mit:

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 

Meiner Frage lautet: Statt zwei Iterationen durchzuführen, wenn ich nur eine Iteration mit einer 6x6 Strukturierung durchführen Element, entspricht dies dem obigen Code in Bezug auf Genauigkeit und Leistung? Ist es schneller, da das Bild nur einmal durchlaufen wird?

Antwort

6

Dilation mit dem gleichen Kern kann mit zwei Faltungsoperationen ausgedrückt werden:

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 

Aufgrund der Eigenschaften der Faltung, dieser Vorgang ist equivelant auf:

"YourImage" convolve ("DilationKernel" convolve "DilationKernel") 

eine Faltung eines 3x3 kernel mit sich selbst ergibt sich eine 5x5-Matrix, also ist deine 6x6-Annahme falsch.

In Bezug auf die Leistung gibt es so viel zu beachten. In meinem vorherigen Praktikum ist es unser Ziel, einen so kleinen Kernel wie möglich zu verwenden, wegen Leistungseinbußen größerer Kernel. Eine Faustregel besagt, dass kleine Kernel schneller auf ein Bild wirken, weil Sie sie einfach mit CPU-Registern speichern und abrufen können, ohne auf L1- oder L2-Caches zugreifen zu müssen. Auch wenn Ihr Kernel in Registern passt, können Sie problemlos SSE-Anweisungen verwenden.

Parallelisierung der Faltung ist eine andere Geschichte, und ich habe nicht viele praktische Informationen darüber. Ich weiß also nicht, dass diese empirischen Fakten immer noch gelten, wenn man eine parallelisierte Implementierung verwendet.

+0

Vielen Dank für den Hinweis auf den Fehler. Ich suche immer noch nach einem Leistungsvergleich. Ich denke, ich müsste vielleicht meine eigene Methode entwickeln, um beide Operationen zu vergleichen – masad

0

Sie müssen die Leistung selbst messen, aber es erscheint logisch, dass eine Erweiterung mit einem 6x6 Element schneller sein sollte. Wikipedia Sais, dass binäre Dilatation assoziativ ist. Dies bedeutet, dass, wenn ein 3x3-Rechteck, das mit einem anderen solchen Rechteck erweitert ist, ein 6x6-Rechteck ergibt, tatsächlich zwei Erweiterungen um 3x3 einer Erweiterung um 6x6 entsprechen.

+2

Warum "scheint es logisch"? Eine naive Implementierung müsste 6 * 6 Nachbarn für jedes Pixel oder 2 * 3 * 3 Pixel betrachten. 6 * 6> 2 * 3 * 3 – Niki

+0

@nikie, Sie haben Recht. Bei rechteckigen Strukturierungselementen kann dies jedoch mit Präfixsummen optimiert werden. Ich kenne mich mit Algorithmen zur Bildmorphologie nicht aus. –