gpt4 book ai didi

python - 将对角线渐变倾斜为垂直

转载 作者:行者123 更新时间:2023-11-28 18:28:04 24 4
gpt4 key购买 nike

我有一个与水平方向成一定角度的不太线性的渐变作为图像。这是一些玩具数据:

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)

diagonal gradient

我想从根本上纠正渐变中的倾斜,使其水平,即渐变向右增加,所有垂直切片都是恒定的。

这当然会产生一个 x 轴比输入图像大的平行四边形。返回一个屏蔽的 Numpy 数组将是理想的。这里有一个(可怕的)卡通可以快速说明。

enter image description here

知道如何实现吗?谢谢!

最佳答案

您可以进行插值以确定偏度,然后再次进行插值以对其进行校正。

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 方向非线性的梯度。演示:

demo

完整脚本:

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()

关于python - 将对角线渐变倾斜为垂直,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39776890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com