【问题标题】:numpy transforming RGB image to YIQ color spacenumpy 将 RGB 图像转换为 YIQ 颜色空间
【发布时间】:2018-04-09 23:48:02
【问题描述】:

对于一个类,我需要将 RGB 图像转换为 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 不同时,点积究竟是如何工作的?

【问题讨论】:

  • 来自the docs - For 2-D arrays it is equivalent to matrix multiplication,
  • 可能需要转置,因为图像数组是从所需的转换规范转置
  • Coordinate Conventions - 图像数组维度为(行、列、通道)。所以一个 5x10 的图像将具有 (10, 5, 3) 的形状;红色通道是arr[:,:,0],蓝色是arr[:,:,1] ...

标签: python numpy image-processing matrix multidimensional-array


【解决方案1】:

在包含转换矩阵的参考图中,转换矩阵位于 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) 是在舍入/取int 之后生成的 YIQ 图像中第一个像素的值。我们对整个 RGB 图像中的所有像素做同样的乘法,得到想要的 YIQ 图像。

现在,由于他们使用np.dot(arr, yiq_from_rgb.T) 完成整个实现,因此为了正确计算权重,需要转置变换矩阵。而copy只是为了进行这种转换,专门有一个转置变换矩阵。

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

【讨论】:

  • 我看到了一些迹象,结果也需要除以255。