如何在python中将数组转换为图像颜色通道?

时间:2017-03-21 06:49:39

标签: python image numpy scikit-learn python-imaging-library

我需要在8x8块中分割图像的颜色通道(特别是“Cb”),以便修改DCT系数并在以后重新组合它们。

我正在尝试使用image.extract_patches_2d()

但是我似乎无法重新组装频道

from PIL import Image
from sklearn.feature_extraction import image
import numpy as np

pic = Image.open('lama.png')
pic_size = pic.size
ycbcr = pic.convert('YCbCr')
(y, cb, cr) = ycbcr.split()


acb = np.asarray(cb)
patches = image.extract_patches_2d(acb, (8, 8))
acb2 = image.reconstruct_from_patches_2d(patches, (500,500))
cb_n = Image.fromarray(acb2, 'L')

即使没有对补丁进行任何更改,重新组装的数组也不对应于原始频道:

cb另存为图片:

enter image description here

从补丁中恢复Cb(代码中的cb_n):

enter image description here

代码有问题吗?或者是否无法使用image.reconstruct_from_patches_2d从路径(块)恢复颜色通道?

如果是这样,有没有更好的方法来做我需要的事情?

感谢阅读,感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

Image.fromarray()上调用acb2之前,请确保将dtype更改为int,就像它在开头一样。 image.reconstruct_from_patches_2d将您的图片值更改为float64,而cb中的原始值为uint8。这是我得到的唯一错误来源。除此之外,您的代码按预期工作。

更改您的代码:

acb2 = image.reconstruct_from_patches_2d(patches, (500,500))
cb_n = Image.fromarray(acb2, 'L')

为:

acb2 = image.reconstruct_from_patches_2d(patches, (500,500))
#ADD THIS LINE
acb2 = acb2.astype(np.uint8)
cb_n = Image.fromarray(acb2, 'L')

注意:(与上述无关)

另外,请确保在reconstruct_from_patches_2d中使用正确尺寸的图像尺寸。正如您指定(500,500),我假设宽度与高度(500)相同。但是在高度和宽度不同的图像中,Image module将是 column-major ,而numpy(默认情况下为python数组)为 row-major 。 所以,

pic_size = pic.size

会报告输出(Width, Height),但在reconstruct_from_patches_2d中使用时,请使用(Height, Width)