我有裝入經由PIL一個numpy的陣列的RGB圖像。我得到了一個行x cols x 3數組。修補後,我得到了下面的代碼。我想學習如何在沒有循環的情況下做這樣的數組/矩陣操作。3x3矩陣轉換而不循環(RGB顏色轉換)
# Note using matrix not array.
rgb_to_ycc = np.matrix(
(0.2990, 0.5870, 0.1140,
-0.1687, -0.3313, 0.5000,
0.5000, -0.4187, -0.0813,)
).reshape(3,3)
ycc_to_rgb = np.matrix(
(1.0, 0.0, 1.4022,
1.0, -0.3456, -0.7145,
1.0, 1.7710, 0,)
).reshape(3, 3)
def convert_ycc_to_rgb(ycc) :
# convert back to RGB
rgb = np.zeros_like(ycc)
for row in range(ycc.shape[0]) :
rgb[row] = ycc[row] * ycc_to_rgb.T
return rgb
def convert_rgb_to_ycc(rgb) :
ycc = np.zeros_like(rgb)
for row in range(rgb.shape[0]):
ycc[row] = rgb[row] * rgb_to_ycc.T
return ycc
我可以使用http://pypi.python.org/pypi/colormath(通過Using Python to convert color formats?),但我用這個作爲一個練習學習numpy的。
上述Colormath庫使用的點積。
# Perform the adaptation via matrix multiplication.
result_matrix = numpy.dot(var_matrix, rgb_matrix)
我的數學不是它應該在的地方。 np.dot()是我最好的選擇嗎?
編輯。更深層次的閱讀colormath的apply_RGB_matrix()之後 - color_conversions.py,我發現np.dot如果轉換3x3s是不矩陣()的作品。奇怪的。
def convert_rgb_to_ycc(rgb) :
return np.dot(rgb, np.asarray(rgb_to_ycc).T)
啊!實際上,使用3x3作爲陣列而不是矩陣是解決方案。並且內聯轉換矩陣的確會使代碼更好看。謝謝!而np.allclose()是學習的新東西。 –