Roberts Edge Detector cómo usar?

10

Estoy tratando de usar la detección de bordes de Roberts para procesar una imagen. ¿Solo aplico ambas máscaras a la imagen y realizo la convolución de manera normal? ¿Podría alguien darme un desglose de cómo usar este método de detección de bordes, ya que estoy tratando de programarlo para procesar una imagen en escala de grises. Envolví la imagen usando ambos núcleos por separado, pero la imagen se ve bien.

Gracias.

adamjmarkham
fuente

Respuestas:

10

Robert's Cross es un poco complicado porque no es un tamaño extraño (2x2 en lugar de 3x3 o 5x5). Lo hice usando numpy + scipy usando una máscara de convolución 3x3 acolchada.

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 )

De la entrada de Wikipedia en Robert's Cross. http://en.wikipedia.org/wiki/Roberts_Cross

Imagen de Robert's Cross Entry en Wikipedia

La salida de mi script.

Mi salida de script

David Poole
fuente
¿Cuadras cada valor de píxel en la imagen?
adamjmarkham
Si. El "np.sqrt (np.square (horizontal) + np.square (vertical))" da la magnitud del vector entre las direcciones horizontal y vertical.
David Poole
El wiki del detector de bordes de @DavidPoole Robert es fantástico, simple, directo e ilustrativo. ¿Cómo / por qué es sensible al ruido VS otras medidas de gradiente? ¿No hay una sola medida de gradiente 'verdadera'?
Spacey
Estoy tratando de implementar esta función en python (versión Spyder) pero tengo problemas para comprender los argumentos que se necesitan y cómo alimentarlos. ¿Qué es infilename y outfilename? Gracias Sam
infilename es una imagen en escala de grises (1 plano). outfilename es solo un archivo de salida en el que el script escribirá. Las imágenes de entrada / salida pueden ser jpeg, png, tif, etc. La biblioteca de imágenes (ahora Pillow) interpretará el formato de la imagen según la extensión del archivo. Ejemplo: python3 rcross.py bicycle.jpg out.tif
David Poole