Roberts Edge Detector wie zu verwenden?

10

Ich versuche, Roberts Kantenerkennung zu verwenden, um ein Bild zu verarbeiten. Wende ich einfach beide Masken auf das Bild an und führe die Faltung wie gewohnt durch? Könnte mir jemand eine Aufschlüsselung der Verwendung dieser Kantenerkennungsmethode geben, da ich versuche, sie so zu programmieren, dass sie ein Graustufenbild verarbeitet. Ich habe das Bild mit beiden Kerneln getrennt gefaltet, aber das Bild sieht richtig aus.

Vielen Dank.

Adamjmarkham
quelle

Antworten:

10

Roberts Kreuz ist etwas knifflig, weil es keine ungerade Größe hat (2x2 statt 3x3 oder 5x5). Ich habe es mit numpy + scipy mit einer gepolsterten 3x3-Faltungsmaske gemacht.

import sys
import numpy as np
from scipy import ndimage
import Image

roberts_cross_v = np.array( [[ 0, 0, 0 ],
                             [ 0, 1, 0 ],
                             [ 0, 0,-1 ]] )

roberts_cross_h = np.array( [[ 0, 0, 0 ],
                             [ 0, 0, 1 ],
                             [ 0,-1, 0 ]] )
def load_image( infilename ) :
    img = Image.open( infilename )
    img.load() 
    # note signed integer
    return np.asarray( img, dtype="int32" )

def save_image( data, outfilename ) :
    img = Image.fromarray( np.asarray( np.clip(data,0,255), dtype="uint8"), "L" )
    img.save( outfilename )

def roberts_cross( infilename, outfilename ) :
    image = load_image( infilename )

    vertical = ndimage.convolve( image, roberts_cross_v )
    horizontal = ndimage.convolve( image, roberts_cross_h )

    output_image = np.sqrt( np.square(horizontal) + np.square(vertical))

    save_image( output_image, outfilename )

infilename = sys.argv[1]
outfilename = sys.argv[2]
roberts_cross( infilename, outfilename )

Aus dem Wikipedia-Eintrag zu Roberts Kreuz. http://en.wikipedia.org/wiki/Roberts_Cross

Bild von Roberts Kreuzeintrag auf Wikipedia

Die Ausgabe meines Skripts.

Meine Skriptausgabe

David Poole
quelle
Quadrieren Sie jeden Pixelwert im Bild?
Adamjmarkham
Ja. Das "np.sqrt (np.square (horizontal) + np.square (vertikal))" gibt die Vektorgröße zwischen den horizontalen und vertikalen Richtungen an.
David Poole
@DavidPoole Roberts Kantenerkennungs-Wiki ist fantastisch - einfach, auf den Punkt und illustrativ. Wie / warum ist es empfindlich gegenüber Rauschen im Vergleich zu anderen Gradientenmessungen? Gibt es nicht nur ein "wahres" Gradientenmaß?
Spacey
Ich versuche, diese Funktion in Python (Spyder-Version) zu implementieren, habe aber Probleme, die erforderlichen Argumente zu verstehen und wie ich sie füttere. Was ist Infilename und Outfilename? Danke Sam
Der Dateiname ist ein Graustufenbild (1 Ebene). outfilename ist nur eine Ausgabedatei, in die das Skript schreibt. Die Eingabe- / Ausgabebilder können JPEG, PNG, TIF usw. sein. Die Bildbibliothek (jetzt Pillow) interpretiert das Bildformat basierend auf der Dateierweiterung. Beispiel: python3 rcross.py bicycle.jpg out.tif
David Poole