复制 numpy 数组值时获取图片的负片

Getting a negative of picture when copying numpy array values

我正在尝试手动复制图像,但我这样做的结果是原始图像的负片。我似乎无法找出原因,所以请帮忙。

这是代码:

def copy(image):
    padded_image = np.ndarray(shape=image.shape)
    for i in xrange(0, image.shape[0]):
        for j in xrange(0, image.shape[1]):
            padded_image[i][j] = image[i][j]

    return padded_image

我是这样看图片的:

jelly_beans = io.imread("4.1.07-jelly-beans.tiff")

这就是我显示图像的方式:

    def show_images(images, titles = None):

        """Display a list of images"""
        n_ims = len(images)
        if titles is None: titles = ['(%d)' % i for i in range(1,n_ims + 1)]
        fig = plt.figure()
        n = 1
        for image,title in zip(images,titles):
            a = fig.add_subplot(1,n_ims,n) # Make subplot
            if image.ndim == 2: # Is image grayscale?
                plt.gray() 
            plt.imshow(image)
            a.set_title(title)
            n += 1
        fig.set_size_inches(np.array(fig.get_size_inches()) * n_ims)
        plt.show()

问题是,当您使用 ndarray 创建 padded_image 时,您没有指定 dtype,因此它默认为浮点数。然后你使用 imshow 显示一个浮点数组,其值在 [0, 1] 范围内未标准化,因此 imshow 自己进行某种标准化,结果是 "opposite" 颜色。 (并不是所有的浮点图像都会像那样反转。)

您可以使用

解决这个问题
padded_image = np.ndarray(shape=image.shape, dtype=image.dtype)

这应该可以解决眼前的问题。更好的解决方法是不编写自己的 copy 函数。 numpy ndarray 有一个 copy 方法,所以你可以这样做,例如

image2 = image1.copy()