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.

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.