对于课程,我需要将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 pic作为矩阵时
我试图理解为什么这有效?为什么他们采用Transpose矩阵? (.T)
当arr
形状与yiq_from_rgb不同时,点积如何工作?
答案 0 :(得分:2)
在包含转换矩阵的参考图中,转换矩阵位于RGB通道的左侧。因此,对于RGB图像中的第一个像素,我们分别称它为对应于R,G,B通道的(p1r, p1g, p1b)
,我们需要乘以变换矩阵并将结果相加如下:
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数组位于转换矩阵的左侧。