Aplicar matriz de transformación a píxeles en imagen OpenCV.

Quiero cambiar la base de color de una imagen de RGB a otra cosa. Tengo una matriz M que quiero aplicar al RGB de cada píxel, que podemos definir como x ij .

Actualmente estoy iterando sobre cada píxel de la imagen NumPy y calculando Mx ij manualmente. Ni siquiera puedo vectorizarlo sobre las filas, porque el RGB es un 1×3 en lugar de una matriz de 3×1.

¿Hay una mejor manera de hacer esto? Tal vez una función en OpenCV o NumPy?

No puedo recordar la forma canónica de hacer esto (posiblemente evitando los transpuestos) pero esto debería funcionar:

import numpy as np M = np.random.random_sample((3, 3)) rgb = np.random.random_sample((5, 4, 3)) slow_result = np.zeros_like(rgb) for i in range(rgb.shape[0]): for j in range(rgb.shape[1]): slow_result[i, j, :] = np.dot(M, rgb[i, j, :]) # faster method rgb_reshaped = rgb.reshape((rgb.shape[0] * rgb.shape[1], rgb.shape[2])) result = np.dot(M, rgb_reshaped.T).T.reshape(rgb.shape) print np.allclose(slow_result, result) 

Si se trata de una transformación entre espacios de color estándar, debe usar Scikit Image: