2016-04-14 5 views
6

Я изучаю, как изменяется интенсивность кольца в зависимости от угла. Вот пример изображения:Возьмите данные из круга в python

enter image description here

То, что я хотел бы сделать, это круг ценностей внутри центра этого бублика и построить их против угла. То, что я сейчас делаю, это использовать scipy.ndimage.interpolation.rotate и принимать срезы радиально через кольцо и извлекать максимум из двух пиков и наносить их на угол.

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] 

Однако я не думаю, что это делает то, что я на самом деле ищу. Я в основном пытаюсь извлечь нужные данные. Я также попытался применить маску, которая выглядит так:

enter image description here

к изображению, но тогда я не знаю, как получить значение в пределах этой маски в правильном порядке (т.е. в порядке увеличения угла 0 -. 2pi)

Любого другого идеи были бы очень полезны!

ответ

3

Я сделал другое входное изображение, чтобы помочь проверить корректность:

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

Для выборочных значений из круговых траекторий на изображении, мы сначала построить интерпол, потому что мы хотим получить доступ к произвольным адресам. Мы также векторизуем его быстрее.
Затем мы генерируем координаты N точек на окружности круга, используя параметрическое определение круга x(t) = sin(t), y(t) = cos(t).
N должно быть как минимум в два раза больше по окружности (теорема выборки Найквиста-Шеннона).

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

Привет, Большое спасибо за ответы. Код выглядит великолепно, однако я получаю то, что у вас есть, когда я вынимаю линию. image = image/np.amax (изображение) тогда он работает как обычно! Если нет, я получаю оригинальное изображение полностью черного цвета, кроме одного маленького белого квадрата в нижнем правом порядке. Я немного запутался в том, как работает scipy interp2d - я импортирую изображение с помощью функции imread scipy.misc, поэтому я не уверен, как разбить это на требуемые входы x y и z для interp2d? – arbitraryknowledge

+1

А, я написал код Python3, и у вас есть Python 2.7, правильно? Попробуйте 'image = image * 1.0/np.max (image)'. Также измените на 'xcenter = 0.5 * len (x) ' и т. Д. Это связано с [целым делением] (http://stackoverflow.com/q/21316968/1292641). – Norman

+1

Ваше изображение из 'imread()' является ndarray. Попробуйте 'h, w = image.shape; sp.interpolate.interp2d (np.arange (w), np.arange (h), image) '. – Norman

Смежные вопросы