scipy

2011-08-25 15 views
10

का उपयोग करके सोबेल फ़िल्टर को लागू करना मैं एक छवि पर सोबेल फ़िल्टर को लागू करने की कोशिश कर रहा हूं ताकि scipy का उपयोग कर किनारों का पता लगाया जा सके। मैं विंडोज 7 अल्टीमेट (64 बिट) पर पायथन 3.2 (64 बिट) और एससीपी 0.9.0 का उपयोग कर रहा हूं। वर्तमान में मेरे कोड इस प्रकार है:scipy

import scipy 
from scipy import ndimage 

im = scipy.misc.imread('bike.jpg') 
processed = ndimage.sobel(im, 0) 
scipy.misc.imsave('sobel.jpg', processed) 

मैं मैं गलत क्या कर रही हूं पता नहीं है, लेकिन प्रसंस्कृत छवि क्या यह होना चाहिए की तरह कुछ भी नहीं लगती है। छवि, 'bike.jpg' एक ग्रेस्केल (मोड 'एल' नहीं 'आरजीबी') छवि है, इसलिए प्रत्येक पिक्सेल में इसके साथ केवल एक मान जुड़ा होता है।

दुर्भाग्य से मैं यहाँ छवियों पोस्ट कर सकते हैं अभी तक नहीं (पर्याप्त प्रतिष्ठा नहीं है), लेकिन मैं नीचे दिए गए लिंक प्रदान की है:

मूल छवि (bike.jpg): http://s2.postimage.org/64q8w613j/bike.jpg

SciPy फ़िल्टर (sobel.jpg): http://s2.postimage.org/64qajpdlb/sobel.jpg

अपेक्षित आउटपुट: http://s1.postimage.org/5vexz7kdr/normal_sobel.jpg

मैं स्पष्ट रूप से जा रहा हूँ गलत रों omewhere! क्या कोई मुझे बता सकता है कि कहां है। धन्यवाद।

उत्तर

20

1) उच्च परिशुद्धता का उपयोग करें। 2) आप केवल शून्य धुरी के साथ व्युत्पन्न के अनुमान की गणना कर रहे हैं। 2 डी सोबेल ऑपरेटर को Wikipedia पर समझाया गया है। इस कोड को आजमाएं:

import numpy 
import scipy 
from scipy import ndimage 

im = scipy.misc.imread('bike.jpg') 
im = im.astype('int32') 
dx = ndimage.sobel(im, 0) # horizontal derivative 
dy = ndimage.sobel(im, 1) # vertical derivative 
mag = numpy.hypot(dx, dy) # magnitude 
mag *= 255.0/numpy.max(mag) # normalize (Q&D) 
scipy.misc.imsave('sobel.jpg', mag) 
+0

हाँ, मैं 0 अक्ष (DX) भर में व्युत्पन्न चाहता था। मैं वास्तव में कैनी एज डिटेक्टर को कार्यान्वित करने की कोशिश कर रहा हूं और सोबेल ऑपरेटरों का उपयोग करके ढाल की गणना करने में समस्याएं थीं। बहुत बहुत धन्यवाद! मुझे परिशुद्धता बदलने की जरूरत थी। – Feanor

6

मैं cgohlke के उत्तर पर टिप्पणी नहीं कर सका इसलिए मैंने एक जवाब के साथ अपना जवाब दोहराया। पैरामीटर क्षैतिज व्युत्पन्न के लिए खड़ी व्युत्पन्न और के लिए प्रयोग किया जाता है (पहले एक छवि सरणी की धुरी y/ऊर्ध्वाधर दिशा है - पंक्तियों, और दूसरा अक्ष एक्स/क्षैतिज दिशा है - कॉलम)। बस अन्य उपयोगकर्ताओं को चेतावनी देना चाहता था, क्योंकि गलत जगहों पर गलती की तलाश में 1 घंटा खो गया था।

import numpy 
import scipy 
from scipy import ndimage 

im = scipy.misc.imread('bike.jpg') 
im = im.astype('int32') 
dx = ndimage.sobel(im, 1) # horizontal derivative 
dy = ndimage.sobel(im, 0) # vertical derivative 
mag = numpy.hypot(dx, dy) # magnitude 
mag *= 255.0/numpy.max(mag) # normalize (Q&D) 
scipy.misc.imsave('sobel.jpg', mag) 
+1

बस स्पष्ट होने के लिए, ढाल किनारों पर ऑर्थोगोनल है, क्षैतिज व्युत्पन्न * लंबवत * किनारों का पता लगाता है। – dtk

0

या आप उपयोग कर सकते हैं:

def sobel_filter(im, k_size): 

    im = im.astype(np.float) 
    width, height, c = im.shape 
    if c > 1: 
     img = 0.2126 * im[:,:,0] + 0.7152 * im[:,:,1] + 0.0722 * im[:,:,2] 
    else: 
     img = im 

    assert(k_size == 3 or k_size == 5); 

    if k_size == 3: 
     kh = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype = np.float) 
     kv = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]], dtype = np.float) 
    else: 
     kh = np.array([[-1, -2, 0, 2, 1], 
        [-4, -8, 0, 8, 4], 
        [-6, -12, 0, 12, 6], 
        [-4, -8, 0, 8, 4], 
        [-1, -2, 0, 2, 1]], dtype = np.float) 
     kv = np.array([[1, 4, 6, 4, 1], 
        [2, 8, 12, 8, 2], 
        [0, 0, 0, 0, 0], 
        [-2, -8, -12, -8, -2], 
        [-1, -4, -6, -4, -1]], dtype = np.float) 

    gx = signal.convolve2d(img, kh, mode='same', boundary = 'symm', fillvalue=0) 
    gy = signal.convolve2d(img, kv, mode='same', boundary = 'symm', fillvalue=0) 

    g = np.sqrt(gx * gx + gy * gy) 
    g *= 255.0/np.max(g) 

    #plt.figure() 
    #plt.imshow(g, cmap=plt.cm.gray)  

    return g 

और अधिक देखने के लिए here

+0

कृपया उत्तर के पाठ में अपने उत्तर का स्पष्टीकरण शामिल करें। लिंक रखना ठीक है, लेकिन * बस * लिंक से बचा जाना चाहिए क्योंकि लिंक समय के साथ टूटा जा सकता है। – toonice