我需要在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另存为图片:
从补丁中恢复Cb(代码中的cb_n):
代码有问题吗?或者是否无法使用image.reconstruct_from_patches_2d从路径(块)恢复颜色通道?
如果是这样,有没有更好的方法来做我需要的事情?
感谢阅读,感谢任何帮助。
答案 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)
。