Roberts Edge Detector jak używać?

10

Próbuję użyć wykrywania krawędzi Robertsa do przetworzenia obrazu. Czy po prostu zastosuję obie maski na obrazie i wykonam splot jak zwykle? Czy ktoś mógłby mi przedstawić sposób korzystania z tej metody wykrywania krawędzi, ponieważ próbuję zaprogramować ją do przetwarzania obrazu w skali szarości. Obraz został zawinięty przy użyciu osobno obu jąder, ale obraz wygląda na prawidłowy.

Dzięki.

adamjmarkham
źródło

Odpowiedzi:

10

Krzyż Roberta jest trochę trudny, ponieważ nie jest dziwny (2x2 zamiast 3x3 lub 5x5). Zrobiłem to przy użyciu numpy + scipy przy użyciu wyściełanej maski splotowej 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 )

Z wpisu w Wikipedii na temat Krzyża Roberta. http://en.wikipedia.org/wiki/Roberts_Cross

Zdjęcie z Robert's Cross Entry na Wikipedii

Wyjście mojego skryptu.

Mój wynik skryptu

David Poole
źródło
Czy obliczysz każdą wartość piksela na obrazie?
adamjmarkham,
Tak. „Np.sqrt (np.square (poziomy) + np.square (pionowy))” podaje wielkość wektora między poziomymi, pionowymi kierunkami.
David Poole,
@DavidPoole Robert's wiki detektor krawędzi jest fantastyczny - prosty, rzeczowy i ilustracyjny. Jak / dlaczego jest wrażliwy na hałas kontra inne miary gradientu? Czy nie ma tylko jednej „prawdziwej” miary gradientu?
Spacey
Próbuję zaimplementować tę funkcję w Pythonie (wersja Spyder), ale mam problem ze zrozumieniem argumentów i sposobu ich podawania? co to jest infilename i outfilename? Dzięki Sam
infilename to obraz w skali szarości (1 płaszczyzna). outfilename to tylko plik wyjściowy, do którego skrypt napisze. Obrazami wejściowymi / wyjściowymi mogą być jpeg, png, tif itp. Biblioteka obrazów (teraz Pillow) zinterpretuje format obrazu na podstawie rozszerzenia pliku. Przykład: python3 rcross.py bicycle.jpg out.tif
David Poole