Roberts Edge Detector como usar?

10

Estou tentando usar a detecção de borda Roberts para processar uma imagem. Aplico as duas máscaras à imagem e realizo a convolução normalmente? Alguém poderia me dar uma explicação de como usar esse método de detecção de borda, pois estou tentando programá-lo para processar uma imagem em escala de cinza. Eu distorci a imagem usando os dois kernels separadamente, mas a imagem está correta.

Obrigado.

adamjmarkham
fonte

Respostas:

10

Robert's Cross é um pouco complicado porque não é um tamanho estranho (2x2 em vez de 3x3 ou 5x5). Eu fiz isso usando numpy + scipy usando uma máscara de convolução 3x3 acolchoada.

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 )

Da entrada da Wikipedia em Robert's Cross. http://en.wikipedia.org/wiki/Roberts_Cross

Imagem da entrada cruzada de Robert na Wikipedia

Saída do meu script.

Minha saída de script

David Poole
fonte
Você quadrada cada valor de pixel na imagem?
precisa saber é o seguinte
Sim. O "np.sqrt (np.square (horizontal) + np.square (vertical))" fornece a magnitude do vetor entre as direções horizontais e verticais.
David Poole
@DavidPoole O wiki de detectores de borda de Robert é fantástico - simples, direto ao ponto e ilustrativo. Como / por que é sensível ao ruído versus outras medidas de gradiente? Não existe apenas uma medida de gradiente "verdadeira"?
Spacey
Estou tentando implementar esta função em python (versão Spyder), mas estou tendo problemas para entender os argumentos necessários e como alimentá-los? o que é infilename e outfilename? Obrigado Sam
infilename é uma imagem em escala de cinza (1 plano). outfilename é apenas um arquivo de saída no qual o script gravará. As imagens de entrada / saída podem ser jpeg, png, tif, etc., a biblioteca de imagens (agora Pillow) interpretará o formato da imagem com base na extensão do arquivo. Exemplo: python3 rcross.py bicycle.jpg out.tif
David Poole