NumPy将RGB图像转换为YIQ颜色空间

7

为了一个课程,我需要将RGB图像转换为YIQ。

我们被告知可以通过以下方式进行转换:

transforming rgb to yiq

我开始编写循环的混乱代码来进行矩阵乘法,然后我发现了一个函数。

 skimage.color.yiq2rgb(imYIQ)

当我看到他们在做什么时,我看到了以下内容(我正在复制一些东西,这样会更清楚):
yiq_from_rgb = yiq_from_rgb = np.array([[0.299,      0.587,        0.114],
                                 [0.59590059, -0.27455667, -0.32134392],
                                 [0.21153661, -0.52273617, 0.31119955]])
return np.dot(arr, yiq_from_rgb.T.copy())

arr只是RGB图像的矩阵时

我正在尝试理解为什么这样可以工作?为什么他们要取转置矩阵?(.T) 当arr的形状与yiq_from_rgb不同时,点积是如何工作的?


文档中得知 - 对于二维数组,它等同于矩阵乘法。 - wwii
也许需要转置,因为图像数组与所需的转换规范不同? - wwii
坐标约定 - 图像数组的维度为(行,列,通道)。因此,一个5x10的图像将具有形状(10,5,3); 红色通道将是 arr[:,:,0],蓝色通道是 arr[:,:,1] ... - wwii
1个回答

7

在您的参考图中,包含了转换矩阵,在RGB通道的左侧。因此,对于您RGB图像中的第一个像素,我们将其称为(p1r, p1g, p1b),分别对应于R、G、B通道,我们需要与转换矩阵相乘并求和结果,如下:

y1y = (0.299*p1r + 0.587*p1g + 0.114*p1b)
y1i = (0.596*p1r - 0.275*p1g - 0.321*p1b)
y1q = (0.212*p1r - 0.523*p1g + 0.311*p1b)

其中(y1y,y1i,y1q)是经过四舍五入/取整后的第一个像素在生成的YIQ图像中的值。我们对整个RGB图像中的所有像素进行相同类型的乘法运算,从而获得所需的YIQ图像。

现在,由于他们使用np.dot(arr, yiq_from_rgb.T)进行整个实现,为了使加权正确运作,转换矩阵需要被转置。而且,copy只是为了有一个专门用于此转换目的的转置变换矩阵。

另外,请注意,与您的图例相反,在np.dot()中,RGB数组位于变换矩阵的左侧。


我看到一些迹象表明结果还需要除以255。 - wwii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接