Python使用numpy.roll()使用重复的边扭曲图像

2024-05-07 14:06:15 发布

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

我有一个numpy数组的图像,带有(w,h,3),我想使用叠加正弦波生成的一些值沿y轴扭曲它

下面是该方法的代码和3个图像(输入、当前输出、所需输出)。所需的输出是使用Photoshop Wave扭曲过滤器完成的,该过滤器具有重复边缘像素的选项。 基本上,我想实现这个选项来重复边缘像素,而不是环绕像素,这样图像看起来更像一条路径

另一件事是,我不认为np.roll()是做这项工作的正确方法,但我对任何与numpy相关的东西都是一个十足的noob

def distortH(data, distortions, w, h):
    imgdata = np.zeros((h, w, 3), dtype=np.uint8)
    for y in range(h):
        imgdata[y] = np.roll(data[y], distortions[y], axis=0)
    return imgdata
  • 数据:带w、h、3的numpy阵列

  • 扭曲:长度为h且扭曲的数组 值介于-500和500之间(在这种情况下,失真值将 根据图像大小具有不同的缩放比例)

  • w:图像的宽度

  • h:图像的高度

提前谢谢

输入: Input image

电流输出 Current output

期望输出 Desired output


Tags: 方法代码图像numpy过滤器data选项np
1条回答
网友
1楼 · 发布于 2024-05-07 14:06:15

解决了

roll()确实不是正确的方法

使用numpy.pad()解决了这个问题

def distortH(data, distortions, w, h):
    imgdata = np.zeros((h, w, 3), dtype=np.uint8)
    for y in range(h):
        if distortions[y] == 0:
            imgdata[y] = data[y]
        elif distortions[y] > 0:
            ndata = np.pad(data[y], ((distortions[y], 0),(0,0)), mode='edge')
            imgdata[y] = ndata[:len(ndata)-distortions[y], :]
        else:
            ndata = np.pad(data[y], ((0, -distortions[y]),(0,0)), mode='edge')
            imgdata[y] = ndata[-distortions[y]:, :]
    return imgdata

可能不是解决这个问题的最佳方法。但这比手动遍历所有行并逐个交换像素要快得多

相关问题 更多 >