2013-10-24 5 views
1

임의의 선을 따라 2D 이미지의 1D 프로파일을 플로팅하고 싶습니다. 이하의 코드에서 호스팅 GitHub의 화상 데이터를 로딩하고 그것을 나타내는 :임의의 이미지 조각과 파이썬/numpy

import urllib 
import numpy as np 
import matplotlib.pyplot as plt 

url = "https://gist.github.com/andreiberceanu/7141843/raw/0b9d50d3d417b1cbe651560470c098700df5a1fc/image.dat" 
f = urllib.urlopen(url) 
data = np.loadtxt(f) 

plt.imshow(data) 

waves with line

상기 플롯에서 적색 선이 예를 들어, 손으로 당겨졌다. 나는 a * x + b 형태로 그것을 매개 변수화할 수 있다고 가정합니다. 또한 선은 데이터의 원래 2D 배열의 일부가 아닐 수도있는 점을 통과하기 때문에 어떤 종류의 보간이 필요하다고 생각합니다.

+0

무엇이 당신의 질문입니까? – alko

+3

관련 질문보기 : http://stackoverflow.com/questions/7878398/how-to-extract-an-arbitrary-line-of-values-from-a-numpy-array – aganders3

답변

2

scipy.ndimage.map_coordinates을 사용하려고합니다. 샘플링 할 좌표 인 2xn 배열을 작성한 다음 map_coordinates(im, samples)을 수행해야합니다.

def sliceImage(I, a, b, *arg, **kws): 
    from scipy import linspace, asarray 
    from scipy.ndimage import map_coordinates 
    from scipy.linalg import norm 
    dst = norm(asarray(b) - a) + 1 
    return map_coordinates(I, [linspace(strt, end, dst) 
           for strt, end in zip(a, b)], 
          *arg, **kws) 

편집 :

나는이 그것을 생각 더 고려에, 나는 이것이 더 우아한 생각 :

def sliceImage(I, a, b, *arg, **kws): 
    from scipy import linspace, asarray 
    from scipy.ndimage import map_coordinates 
    from scipy.linalg import norm 
    a = asarray(a) 
    b = asarray(b) 
    dst = norm(b - a) + 1 
    return map_coordinates(I, (a[:,newaxis] * linspace(1, 0, dst) + 
           b[:,newaxis] * linspace(0, 1, dst)), 
          *arg, **kws) 

편집 : tcaswell 감사 : 1 추가에 dst.

+1

나는 생성하는 명확한 방법이 있다고 느낀다. 샘플링하는 포인트의리스트 – tacaswell

+0

동의합니다. 이 접근법이 더 numpyish입니다 : a = asarray (a); b = asarray (b); dst = norm (b-a); return map_coordinates (I, (a, : newaxis) * linspace (1, 0, dst) + b [:, newaxis] * linspace (0, 1, dst)), * arg, ** kws) – Ben

+1

충분한 공간을 확보하기 위해'linspace (0, 1, int (np.ceil (dst)) + 1)'과 같은 것을 사용할 것입니다. ('a, b = (0, 0), (0, 1)'이 당신이 생각하는 것을 되돌려 주어야한다) – tacaswell