我在与水平方向成某个角度时有一个非常线性的渐变作为图像。这是一些玩具数据:
g = np.ones((5,20))
for x in range(g.shape[0]):
for y in range(g.shape[1]):
g[x,y] += (x+y)*0.1+(y*0.01)
我想基本上纠正渐变中的偏斜,使其处于水平状态,即渐变增加到右边,所有垂直切片都是常量。
这当然会产生具有比输入图像更大的x轴的平行四边形。返回一个蒙面的Numpy数组是理想的。这是一个(可怕的)卡通片,可以快速说明。
知道怎么做到这一点?谢谢!
答案 0 :(得分:1)
您可以插入以确定偏斜并再次插值以纠正它。
import numpy as np
from scipy.ndimage.interpolation import map_coordinates
m, n = g.shape
j_shift = np.interp(g[:,0], g[0,:], np.arange(n))
pad = int(np.max(j_shift))
i, j = np.indices((m, n + pad))
z = map_coordinates(g, [i, j - j_shift[:,None]], cval=np.nan)
这适用于示例图像,但您必须进行一些额外的检查才能使其在其他渐变上起作用。但它不适用于x方向非线性的渐变。演示:
完整脚本:
import numpy as np
from scipy.ndimage.interpolation import map_coordinates
def fix(g):
x = 1 if g[0,0] < g[0,-1] else -1
y = 1 if g[0,0] < g[-1,0] else -1
g = g[::y,::x]
m, n = g.shape
j_shift = np.interp(g[:,0], g[0,:], np.arange(n))
pad = int(np.max(j_shift))
i, j = np.indices((m, n + pad))
z = map_coordinates(g, [i, j - j_shift[:,None]], cval=np.nan)
return z[::y,::x]
import matplotlib.pyplot as plt
i, j = np.indices((50,100))
g = 0.01*i**2 + j
plt.figure(figsize=(6,5))
plt.subplot(211)
plt.imshow(g[::-1], interpolation='none')
plt.title('original')
plt.subplot(212)
plt.imshow(fix(g[::-1]), interpolation='none')
plt.title('fixed')
plt.tight_layout()