在numpy中移动图像

2024-09-27 04:22:16 发布

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

我有一个二维核阵列的图像。我想将图像偏移一个X和Y偏移量,并希望帧的其余部分用零填充。我看过关于“roll”函数的讨论,但它只在一个轴上有效。(除非有人能给我指一个有填充的二维版本)。我试过切片,但当偏移量有所有可能的方向时,我遇到了麻烦。我不想浏览所有的X-Y偏移量+/-排列。有一个简单的通用解决方案吗?下面的代码对X-offset=+100很有用。但是当X-offset=-100时它崩溃了。

谢谢, 格特

import matplotlib.pyplot as plt
import scipy.misc        as msc
import numpy             as np

lena = msc.lena()
lena.dtype
(imx,imy)= lena.shape
ox= 100
oy= 20
shift_lena = np.zeros((imx,imy))
shift_lena[0:imy-oy,0:imx-ox] = lena[oy:,ox:]
shift_lena_m = shift_lena.astype(np.int64)
shift_lena_m.dtype
plt.figure(figsize=(10, 3.6))
plt.subplot(131)
plt.imshow(lena, cmap=plt.cm.gray)
plt.subplot(132)
plt.imshow(shift_lena_m, cmap=plt.cm.gray)
plt.subplots_adjust(wspace=0, hspace=0., top=0.99, bottom=0.01, left=0.05, right=0.99)
plt.show()

Tags: 图像importshiftasnppltoffset偏移量
2条回答

您可以使用滚动函数来循环移动x和y,然后将偏移量归零

def shift_image(X, dx, dy):
    X = np.roll(X, dy, axis=0)
    X = np.roll(X, dx, axis=1)
    if dy>0:
        X[:dy, :] = 0
    elif dy<0:
        X[dy:, :] = 0
    if dx>0:
        X[:, :dx] = 0
    elif dx<0:
        X[:, dx:] = 0
    return X

没有其他方法可以相应地处理正负变化:

non = lambda s: s if s<0 else None
mom = lambda s: max(0,s)

ox, oy = 100, 20

shift_lena = numpy.zeros_like(lena)
shift_lena[mom(oy):non(oy), mom(ox):non(ox)] = lena[mom(-oy):non(-oy), mom(-ox):non(-ox)]

相关问题 更多 >

    热门问题