【问题标题】:How to apply vector field to image in 2D with python?如何使用python将矢量场应用于二维图像?
【发布时间】:2020-03-01 00:55:11
【问题描述】:

我使用库FyeldGenerator 生成两个高斯随机场。如果它们被绘制出来,是这样的:

from FyeldGenerator import generate_field
import matplotlib.pyplot as plt
import numpy as np

# Helper that generates power-law power spectrum
def Pkgen(n):
    def Pk(k):
        return np.power(k, -n)
    return Pk

# Draw samples from a normal distribution
def distrib(shape):
    a = np.random.normal(loc=0, scale=1, size=shape)
    b = np.random.normal(loc=0, scale=1, size=shape)
    return a + 1j * b

shape = (512, 512)

field_x = generate_field(distrib, Pkgen(3), shape)
field_y = generate_field(distrib, Pkgen(3), shape)

plt.imshow(field_x, cmap='seismic')
plt.show()
plt.imshow(field_y, cmap='seismic')

然后我用 matplotlib 和quiver 绘制向量场。

现在我想将随机场大小相同的图像应用于矢量场。我希望点 (i,j) 中的像素沿方向(二维)移动,这在 quiver 函数中显示。有什么办法吗?

这是在 matlab 上完成的这个问题的一个例子,但在 3D 中:

stackoverflow 的链接:Applying a vector field to image in matlab

【问题讨论】:

    标签: python matlab opencv matplotlib computer-vision


    【解决方案1】:

    我认为您正在寻找的是remap function in opencv。 如链接中所述,该函数根据索引数组 mapx 和 mapy 重新映射值: ???(x,y)=???(mapx(x,y),mapy(x,y))

    如果我正确理解您想要做什么,您首先需要为 mapx 和 mapy 创建基本索引:

    mapx_base, mapy_base = np.meshgrid(np.arange(shape[0]), np.arange(shape[1]))
    

    然后使用矢量场变形图像索引。这里我乘以增加变形。

    mapx = mapx_base + field_x*30
    mapy = mapy_base + field_y*30
    

    最后重新采样您的图像

    img = cv2.imread('apple.jpg', 0).astype(np.float32)
    deformed_apple = cv2.remap(img, mapx.astype(np.float32), mapy.astype(np.float32), cv2.INTER_LINEAR)
    

    当然,如果您想获得较少噪声的变形,则需要对场进行平滑处理。

    希望这会有所帮助!

    【讨论】:

    • @cthnguyen 我很高兴这有帮助!如果现在一切都清楚,请接受关闭主题的答案。谢谢!
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多