如何使用python将矢量场应用于2D图像?

我用库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,size=shape)
    return a + 1j * b

shape = (512,512)

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

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

如何使用python将矢量场应用于2D图像?

然后,我用quiver的矢量字段使用matplotlib进行绘制。

如何使用python将矢量场应用于2D图像?

现在,我想将图像应用于大小相同的随机字段(矢量字段)。我希望点(i,j)中的像素沿2D方向移动,如颤动函数所示。反正有做吗?

这是在matlab上完成的此问题的示例,但在3D模式下:

  

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

如何使用python将矢量场应用于2D图像?

l464547980 回答:如何使用python将矢量场应用于2D图像?

我认为您正在寻找的是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)

当然,如果您希望产生较小的噪声变形,则需要对场进行平滑处理。

希望这会有所帮助!

apple enter image description here

本文链接:https://www.f2er.com/3165021.html

大家都在问