【发布时间】:2021-08-03 02:35:00
【问题描述】:
我有一个矩阵,它是一个包含 BGR 值的图像。这是经过切片以使其在问题中更短的图像
img = [[[72, 63, 0],
[71, 62, 0],
[70, 61, 0]],
[[73, 64, 1],
[71, 62, 0],
[70, 61, 0]],
[[73, 64, 1],
[72, 63, 0],
[71, 62, 0]],
[[73, 64, 1],
[72, 63, 0],
[71, 62, 0]],
[[74, 65, 2],
[72, 63, 0],
[71, 62, 0]]]
我已经成功地制作了一个将 BGR 值转换为 YIQ 的函数,但该函数没有将 YIQ 值转换为 uint8。它使 I 和 Q 值可以为负值
import numpy as np
def RGB2YIQ(img):
BGR = img.copy().astype(float)
R = BGR[:,:,2]
G = BGR[:,:,1]
B = BGR[:,:,0]
Y = (0.299 * R) + (0.587 * G) + (0.114 * B)
I = (0.59590059 * R) + (-0.27455667 * G) + (-0.32134392 * B)
Q = (0.21153661 * R) + (-0.52273617 * G) + (0.31119955 * B)
YIQ = (np.dstack((Y,I,Q))).astype(int)
return YIQ
>>> RGB2YIQ(img)
>>> array([[[ 45, -40, -10],
[ 44, -39, -10],
[ 43, -39, -10]],
[[ 46, -40, -10],
[ 44, -39, -10],
[ 43, -39, -10]],
[[ 46, -40, -10],
[ 45, -40, -10],
[ 44, -39, -10]],
[[ 46, -40, -10],
[ 45, -40, -10],
[ 44, -39, -10]],
[[ 47, -40, -10],
[ 45, -40, -10],
[ 44, -39, -10]]])
我也已将转换回 RGB,它也可以正常工作
def YIQ2RGB(img):
YIQ = img.copy().astype(int)
Y = YIQ[:,:,0]
I = YIQ[:,:,1]
Q = YIQ[:,:,2]
R = (1 * Y) + (0.95598634 * I) + (0.6208248 * Q)
G = (1 * Y) + (-0.27201283 * I)) + (-0.64720424 * Q)
B = (1 * Y) + (-1.10674021 * I) + (1.70423049 * Q)
RGB = (np.dstack((R,G,B))).astype(np.uint8)
return RGB
>>>YIQ2RGB(img)
>>>array([[[ 0, 62, 72],
[ 0, 61, 70],
[ 0, 60, 69]],
[[ 1, 63, 73],
[ 0, 61, 70],
[ 0, 60, 69]],
[[ 1, 63, 73],
[ 0, 62, 72],
[ 0, 61, 70]],
[[ 1, 63, 73],
[ 0, 62, 72],
[ 0, 61, 70]],
[[ 2, 64, 74],
[ 0, 62, 72],
[ 0, 61, 70]]], dtype=uint8)
当我尝试将 YIQ 数组设置为 uint8 类型,然后将其转换回 RGB 时,就会出现问题。我尝试将 128 添加到 I 和 Q 通道中,因此我修改了 RGB2YIQ 函数以返回一个 uint8 类型数组
import numpy as np
def RGB2YIQ(img):
BGR = img.copy().astype(float)
R = BGR[:,:,2]
G = BGR[:,:,1]
B = BGR[:,:,0]
Y = (0.299 * R) + (0.587 * G) + (0.114 * B)
I = (0.59590059 * R) + (-0.27455667 * G) + (-0.32134392 * B)
Q = (0.21153661 * R) + (-0.52273617 * G) + (0.31119955 * B)
YIQ = (np.dstack((Y,I + 128,Q + 128))).astype(np.uint8)
return YIQ
>>> RGB2YIQ(img)
>>> array([[[ 45, 87, 117],
[ 44, 88, 117],
[ 43, 88, 117]],
[[ 46, 87, 117],
[ 44, 88, 117],
[ 43, 88, 117]],
[[ 46, 87, 117],
[ 45, 87, 117],
[ 44, 88, 117]],
[[ 46, 87, 117],
[ 45, 87, 117],
[ 44, 88, 117]],
[[ 47, 87, 117],
[ 45, 87, 117],
[ 44, 88, 117]]], dtype=uint8)
但是当我修改 YIQ2RGB 函数并尝试它时,它给了我不同的 Y 值,这很奇怪,因为我唯一改变的是加 128 并减去它,但它只给我一个通道的不同值。
def YIQ2RGB(img):
YIQ = img.copy().astype(int)
Y = YIQ[:,:,0]
I = YIQ[:,:,1] - 128
Q = YIQ[:,:,2] - 128
R = (1 * Y) + (0.95598634 * I) + (0.6208248 * Q)
G = (1 * Y) + (-0.27201283 * I) + (-0.64720424 * Q)
B = (1 * Y) + (-1.10674021 * I) + (1.70423049 * Q)
RGB = (np.dstack((R,G,B))).astype(np.uint8)
return RGB
>>>YIQ2RGB(img)
>>>array([[[255, 63, 71],
[255, 61, 69],
[254, 60, 68]],
[[ 0, 64, 72],
[255, 61, 69],
[254, 60, 68]],
[[ 0, 64, 72],
[255, 63, 71],
[255, 61, 69]],
[[ 0, 64, 72],
[255, 63, 71],
[255, 61, 69]],
[[ 0, 65, 73],
[255, 63, 71],
[255, 61, 69]]], dtype=uint8)
我怀疑这是因为类型转换问题,但我在 np.uint8 之间来回切换 和 int,仍然给我同样的结果
【问题讨论】:
-
为什么你认为负 I 和 Q 值是错误的?
-
它没有错,它是正确的值,但我想将它保存为图像,所以我将它设置在 uint8 范围内。这是我关注的关于使其成为 uint8 stackoverflow.com/a/22367513/12120197 的帖子
标签: python numpy image-processing python-imaging-library