我想沿着任意一条线绘制2D图像的一维轮廓。下面的代码加载github上托管的图像数据并绘制它:
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)
上图中的红线是手工绘制的,作为一个例子。我想可以用a * x + b的形式对它进行参数化。我也猜测某种插值是必要的,因为这条线通过的点可能不是原始2D数据数据的一部分。
答案 0 :(得分: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
。