是否有一个功能可以在图像上应用位移贴图/矩阵?

2024-04-26 00:37:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我生成一个大小为(H,W,2)的位移贴图/矩阵,每个通道对应于x和y值的位移。目标是用位移贴图的值“移动”给定形状(H,W,3)图像的像素值。在

一个只有一个通道(例如x)的简单示例是:

disp_map = np.array([[ 0, 1, 1, 0 ], 
                      [0, 0, 0, 0],
                      [1, 1, 0, 0]])

im = np.array([[ 0, 1, 1, 0 ], 
              [0, 1, 1, 0],
              [0, 0, 0, 0]])

output = apply_disp_function(im, disp_map) 
output 
np.array([[ 1, 1, 0, 0 ], 
          [0, 1, 1, 0],
          [0, 0, 0, 0]])

我不知道是否已经有一个函数可以实现这个功能,或者我必须用numpy编写一个带有切片的函数。在


Tags: 函数图像示例map目标outputnpfunction
1条回答
网友
1楼 · 发布于 2024-04-26 00:37:01

这里有一个可能的解决方案。在这里,disp_map数组应该在其最后一个维度中为每个轴有一个映射。超出图像边界的位移将环绕。在

import numpy as np

def displace(im, disp_map):
    im = np.asarray(im)
    disp_map = np.asarray(disp_map)
    grid = np.ogrid[list(map(slice, disp_map.shape[:-1]))]
    result = np.zeros_like(im)
    np.add.at(result, tuple((g + disp_map[..., i]) % im.shape[i]
                            for i, g in enumerate(grid)), im)
    return result

# Each pair of values represents the number of rows and columns
# that each element will be displaced
disp_map = np.array([[[ 0,  0], [ 0, -1], [ 0,  1], [ 0,  0]],
                     [[ 0,  0], [ 1,  0], [ 1,  1], [ 0,  0]],
                     [[ 0,  1], [ 0,  1], [ 0,  0], [ 0,  0]]])
im = np.array([[ 0,  1,  1,  0],
               [ 0,  1,  1,  0],
               [ 0,  0,  0,  0]])
output = displace(im, disp_map)
print(output)
# [[1 0 0 1]
#  [0 0 0 0]
#  [0 1 0 1]]

相关问题 更多 >