gpt4 book ai didi

python - numpy.ndarray 具有每个图像像素的 n 个值的形状(高度,宽度,n)

转载 作者:太空宇宙 更新时间:2023-11-04 02:14:06 25 4
gpt4 key购买 nike

我的输入是一个 PIL.Image.Image 模式为 RGBRGBA,我需要填充一个 numpy。 ndarray 具有根据每个像素的 RGB 值计算的 3 个浮点值。输出数组应该可以通过像素坐标进行索引。我找到了以下方法:

import numpy as np
from PIL import Image

def generate_ycbcr(img: Image.Image):
for r, g, b in img.getdata():
yield 0.299 * r + 0.587 * g + 0.114 * b
yield 128 - 0.168736 * r - 0.331264 * g + 0.5 * b
yield 128 + 0.5 * r - 0.418688 * g - 0.081312 * b

def get_ycbcr_arr(img: Image.Image):
width, height = img.size
arr = np.fromiter(generate_ycbcr(img), float, height * width * 3)
return arr.reshape(height, width, 3)

它有效,但我怀疑有更好和/或更快的方法。请告诉我是否有,如果没有也请告诉我。

注意:我知道我可以将图像convert() 转换为YCbCr,然后从中填充一个numpy.array,但是转换四舍五入为整数值,这不是我需要的。

最佳答案

对于初学者,您可以将图像直接转换为 numpy 数组并使用矢量化操作来执行您想要的操作:

def get_ycbcr_vectorized(img: Image.Image):
R,G,B = np.array(img).transpose(2,0,1)[:3] # ignore alpha if present
Y = 0.299 * R + 0.587 * G + 0.114 * B
Cb = 128 - 0.168736 * R - 0.331264 * G + 0.5 * B
Cr = 128 + 0.5 * R - 0.418688 * G - 0.081312 * B
return np.array([Y,Cb,Cr]).transpose(1,2,0)

print(np.array_equal(get_ycbcr_arr(img), get_ycbcr_vectorized(img))) # True

但是,您确定直接转换为 'YCbCr' 会有很大不同吗?我测试了上面函数中定义的转换:

import matplotlib.pyplot as plt
def aux():
# generate every integer R/G/B combination
R,G,B = np.ogrid[:256,:256,:256]
Y = 0.299 * R + 0.587 * G + 0.114 * B
Cb = 128 - 0.168736 * R - 0.331264 * G + 0.5 * B
Cr = 128 + 0.5 * R - 0.418688 * G - 0.081312 * B

# plot the maximum error along one of the RGB channels
for arr,label in zip([Y,Cb,Cr], ['Y', 'Cb', 'Cr']):
plt.figure()
plt.imshow((arr - arr.round()).max(-1))
plt.xlabel('R')
plt.ylabel('G')
plt.title(f'max_B ({label} - {label}.round())')
plt.colorbar()

aux()
plt.show()

结果表明最大的绝对误差为 0.5,尽管这些误差发生在所有像素上:

RGB -> Y error RGB -> Cb error RGB -> Cr error

是的,这可能是一个很大的 相对 错误,但这不一定是一个大问题。

如果内置转换就足够了:

arr = np.array(img.convert('YCbCr'))

就是你所需要的。

关于python - numpy.ndarray 具有每个图像像素的 n 个值的形状(高度,宽度,n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53027266/

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