复制numpy数组值时得到图片的负片

时间:2015-11-30 14:15:12

标签: python numpy scikit-image

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

这是代码:

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

enter image description here

这是我阅读图片的方式:

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()

1 个答案:

答案 0 :(得分:4)

问题是,当您使用padded_image创建ndarray时,您没有指定dtype,因此默认为浮点数。然后使用imshow显示一个浮点数组,其值在[0,1]范围内未规范化,因此imshow会对其自身进行某种归一化,从而导致"相反"颜色。 (并非所有浮点图像都会像这样反转。)

您可以使用

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

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

image2 = image1.copy()