2016-04-14 31 views
6

Sto osservando in che modo l'intensità di un anello cambia a seconda dell'angolazione. Ecco un esempio di un'immagine:Prendere dati da una cerchia in python

enter image description here

Quello che vorrei fare è prendere un cerchio di valori all'interno del centro di quella ciambella e tracciare vs angolo. Quello che sto facendo attualmente è usare scipy.ndimage.interpolation.rotate e prendere le fette radialmente attraverso l'anello ed estrarre il massimo dei due picchi e tracciare quelli contro l'angolo.

crop = np.ones((width,width)) #this is my image 
    slices = np.arange(0,width,1) 
    stack = np.zeros((2*width,len(slices))) 
    angles = np.linspace(0,2*np.pi,len(crop2)) 

    for j in range(len(slices2)): # take slices 
      stack[:,j] = rotate(crop,slices[j],reshape=False)[:,width] 

Tuttavia, non penso che stia facendo quello che sto effettivamente cercando. Sono principalmente alle prese con come estrarre i dati che voglio. Ho anche provato ad applicare una maschera simile a questa;

enter image description here

all'immagine, ma poi non so come ottenere i valori all'interno di quella maschera nell'ordine corretto (cioè in ordine crescente di angolo di 0 -. 2pi)

Qualsiasi altro le idee sarebbero di grande aiuto!

risposta

3

Ho fatto un immagine in ingresso differente per aiutare verificare correttezza:

import numpy as np 
import scipy as sp 
import scipy.interpolate 
import matplotlib.pyplot as plt 

# Mock up an image. 
W = 100 
x = np.arange(W) 
y = np.arange(W) 
xx,yy = np.meshgrid(x,y) 

image = xx//5*5 + yy//5*5 
image = image/np.max(image) # scale into [0,1] 

plt.imshow(image, interpolation='nearest', cmap='gray') 
plt.show() 

Alternate input image

per campionare valori da percorsi circolari nell'immagine, abbiamo prima costruire un interpolatore perché si vuole accedere posizioni arbitrarie. Inoltre, la vettorizzazione per essere più veloce.
Quindi, generiamo le coordinate dei punti N sulla circonferenza del cerchio utilizzando la definizione parametrica del cerchio x(t) = sin(t), y(t) = cos(t).
N dovrebbe essere almeno il doppio della circonferenza (teorema di campionamento Nyquist-Shannon).

interp = sp.interpolate.interp2d(x, y, image) 
vinterp = np.vectorize(interp) 

for r in (15, 30, 45): # radii for circles around image's center 
    xcenter = len(x)/2 
    ycenter = len(y)/2 
    arclen = 2*np.pi*r 
    angle = np.linspace(0, 2*np.pi, arclen*2, endpoint=False) 
    value = vinterp(xcenter + r*np.sin(angle), 
        ycenter + r*np.cos(angle)) 
    plt.plot(angle, value, label='r={}'.format(r)) 

plt.legend() 
plt.show() 

Circles sampled from center.

+0

Ciao, grazie mille per la risposta. Il codice sembra fantastico, tuttavia ottengo quello che hai qui quando prendo la linea. image = image/np.amax (image) quindi sembra funzionare come al solito! In caso contrario, finisco con l'immagine originale completamente nera a parte un piccolo quadratino bianco nell'ordine in basso a destra. Sono un po 'confuso su come funziona lo scipy interp2d - Importo un'immagine utilizzando la funzione img di scipy.misc, quindi non sono sicuro di come suddividerlo negli ingressi x y e z necessari per interp2d? – arbitraryknowledge

+1

Ah, ho scritto il codice Python3 e hai Python 2.7, giusto? Prova 'image = image * 1.0/np.max (image)'. Passare anche a 'xcenter = 0.5 * len (x) ', ecc. È a causa della [divisione intera] (http://stackoverflow.com/q/21316968/1292641). – Norman

+1

L'immagine di 'imread()' è un narray. Prova 'h, w = image.shape; sp.interpolate.interp2d (np.arange (w), np.arange (h), image) '. – Norman