gpt4 book ai didi

Python 成像 : YCbCr problems

转载 作者:太空狗 更新时间:2023-10-30 01:10:33 26 4
gpt4 key购买 nike

我正在使用 PIL 在 Python 中进行一些图像处理,我需要从一系列图像中提取亮度层,并使用 numpy 对其进行一些处理,然后将编辑后的亮度层放回图像中并保存.问题是,我似乎无法以 YCbCr 格式获得任何有意义的图像表示,或者至少我不明白 PIL 在 YCbCr 中给我什么。 PIL 文档声称 YCbCr 格式提供了三个 channel ,但是当我使用 np.asarray 从图像中获取数据时,我得到了 4 个 channel 。好的,所以我认为其中一个必须是 alpha。

这是我用来测试这个过程的一些代码:

import Image as im
import numpy as np
pengIm = im.open("Data\\Test\\Penguins.bmp")
yIm = pengIm.convert("YCbCr")
testIm = np.asarray(yIm)

grey = testIm[:,:,0]
grey = grey.astype('uint8')
greyIm = im.fromarray(grey, "L")
greyIm.save("Data\\Test\\grey.bmp")

我期待我的图像的灰度版本,但我得到的是一团乱麻:

http://i.imgur.com/zlhIh.png

任何人都可以向我解释我哪里出错了吗? matlab 中的相同代码完全符合我的预期。

最佳答案

因为 YCbCr 是 simple , 数学上 determinate conversion从 RGB 颜色空间来看,通过 YCbCr 的中间阶段只是从图像中提取计算(非绝对)亮度值的一种间接方式。您可以更直接地完成相同的任务:

yIm = pengIm.convert('L')

我怀疑您通过 numpy asarray 或 fromarray 或在您的 numpy 代码中进行的转换存在问题,因为序列:

>>> import Image
>>> import ImageOps
>>> import ImageChops
>>> c = Image.open('squished_levels.png')
>>> c
<PngImagePlugin.PngImageFile image mode=RGB size=320x240 at 0xB7686DAC>
>>> c.getbands()
('R', 'G', 'B')
>>> d = c.convert('L')
>>> d.getextrema() # squished_levels.png has squished levels for testing
(77, 182)
>>> d.getbands()
('L',)
>>> e = ImageOps.equalize(d)
>>> e.getextrema()
(0, 255)
>>> f = e.convert('RGB')
>>> g = ImageChops.lighter(c, f)
>>> g.show() # not squished in luminance

一切都按预期工作。顺便说一下,

>>> h = c.convert('YCbCr')
>>> h
<Image.Image image mode=YCbCr size=320x240 at 0xB761378C>
>>> h.getpixel((0,0))
(119, 127, 128)
>>> h.getbands()
('Y', 'Cb', 'Cr')

给我三个 channel ,而不是四个。

关于Python 成像 : YCbCr problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com