Détecteur Roberts Edge comment utiliser?

10

J'essaie d'utiliser la détection des contours Roberts pour traiter une image. Dois-je simplement appliquer les deux masques à l'image et effectuer la convolution comme d'habitude? Quelqu'un pourrait-il me donner la ventilation de l'utilisation de cette méthode de détection des contours, alors que j'essaie de la programmer pour traiter une image en niveaux de gris. J'ai alourdi l'image en utilisant les deux noyaux séparément mais l'image a l'air bien.

Merci.

adamjmarkham
la source

Réponses:

10

La croix de Robert est un peu délicate car ce n'est pas une taille étrange (2x2 plutôt que 3x3 ou 5x5). Je l'ai fait en utilisant numpy + scipy en utilisant un masque de convolution rembourré 3x3.

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 )

À partir de l'entrée Wikipedia sur Robert's Cross. http://en.wikipedia.org/wiki/Roberts_Cross

Image de Robert's Cross Entry sur Wikipédia

Sortie de mon script.

Ma sortie de script

David Poole
la source
Mettez-vous au carré chaque valeur de pixel de l'image?
adamjmarkham
Oui. Le "np.sqrt (np.square (horizontal) + np.square (vertical))" donne l'amplitude du vecteur entre les directions horizontales et verticales.
David Poole
@DavidPoole Le wiki du détecteur de bord de Robert est fantastique - simple, précis et illustratif. Comment / pourquoi est-il sensible au bruit VS aux autres mesures de gradient? N'y a-t-il pas une seule «vraie» mesure de gradient?
Spacey
J'essaie d'implémenter cette fonction en python (version Spyder) mais j'ai du mal à comprendre les arguments qu'il faut et comment les nourrir? qu'est-ce que infilename et outfilename? Merci Sam
infilename est une image en niveaux de gris (1 plan). outfilename n'est qu'un fichier de sortie dans lequel le script va écrire. Les images d'entrée / sortie peuvent être jpeg, png, tif, etc., la bibliothèque d'images (maintenant Pillow) interprétera le format d'image en fonction de l'extension du fichier. Exemple: python3 rcross.py bicycle.jpg out.tif
David Poole