Numpy transformando imagen RGB a espacio de color YIQ

Para una clase, necesito transformar la imagen RGB en YIQ. Nos han dicho que la conversión puede ser hecha por:

transformando rgb a yiq

Comencé a escribir un código desordenado con bucles para tener la multiplicación de matrices y luego descubrí una función

skimage.color.yiq2rgb(imYIQ) 

y cuando miré dentro para ver lo que estaban haciendo, vi lo siguiente (estoy copiando cosas para que quede más claro):

 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()) 

cuando arr es solo la imagen RGB como una matriz

Estoy tratando de entender por qué esto funciona? ¿Por qué toman la matriz de transposición? (.T) ¿Y cómo funciona exactamente el producto de puntos cuando la forma arr es diferente a la yiq_from_rgb?

En su figura de referencia que contiene la matriz para la conversión, la matriz de transformación está a la izquierda de los canales RGB. Entonces, para el primer píxel en su imagen RGB, llamémoslo (p1r, p1g, p1b) correspondiente a los canales R, G, B respectivamente, necesitamos multiplicar con la matriz de transformación y sumr los resultados como:

 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) 

donde (y1y,y1i,y1q) es el valor para el primer píxel en la imagen YIQ resultante, después del redondeo / toma int . Hacemos el mismo tipo de multiplicación para todos los píxeles en toda la imagen RGB y obtenemos la imagen YIQ deseada.

Ahora, ya que hacen esta implementación completa utilizando np.dot(arr, yiq_from_rgb.T) , para que la ponderación funcione correctamente, la matriz de transformación debe transponerse. Y copy es solo tener una matriz de transformación transpuesta dedicada para el propósito de esta conversión.

Además, observe que, a diferencia de su figura, en np.dot() la matriz RGB está a la izquierda de la matriz de transformación.