2014-05-22 54 views
1

在numpy中,我正在尋找採用3d數組顏色值(2d表示圖像,其中每個像素均爲RGB顏色)併爲其應用棕褐色濾鏡。假設顏色由r, g, b定義,當把一個棕褐色過濾器,之後返回的顏色是:使用numpy將棕褐色效果應用於3D陣列

sepia_r = .393*r + .769*g + .189&b 
sepia_g = .349*r + .686*g + .168*b 
sepia_b = .272*r + .534*g + .131*b 

什麼會得到這個實時完成的最快的方法用大陣(大概是一3個長向量的1080x864陣列)?

回答

4

假設(height, width, channels)標準圖像陣列組織,則可以使用直接開箱即可使用矩陣乘法。

from skimage.data import lena # Color image version of lena. If you don't have skimage, use any image 
import matplotlib.pyplot as plt 

img = lena().astype(float)/256. 
plt.figure() 
plt.subplot(1, 2, 1) 
plt.imshow(img) 

sepia_filter = np.array([[.393, .769, .189], 
         [.349, .686, .168], 
         [.272, .534, .131]]) 

# here goes the filtering 
sepia_img = img.dot(sepia_filter.T) 

# Unfortunately your filter lines do not have unit sum, so we need to rescale 
sepia_img /= sepia_img.max() 

plt.subplot(1, 2, 2) 
plt.imshow(sepia_img) 
plt.show() 
+0

我想調用img.dot()在'1.6.1'對我不起作用,因爲數組的大小不同(至少在numpy的1.6.1和0.9.0 SciPy的) – bornruffians

+0

工程。此代碼是複製+可粘貼的。嘗試一下!矩陣不必具有相同的大小以便可以多樣化。有必要的是,有*兩個相應的軸*,第一個矩陣中的一個,第二個中的一個。這裏就是這種情況:'img'的最後一個(color-)軸的長度爲3,'sepia_filter.T'的軸0也是。我可以直接使用'numpy.dot',開箱即用,因爲它使用第一個數組中的最後一個軸和第二個數組中的倒數第二個軸,這些都是我需要的。如果需要不同的或幾個,可以使用'np.tensordot' – eickenberg

+1

我得到這個錯誤「ValueError:矩陣不對齊」在該行。可能是因爲我使用的是該圖像的黑白版本,而不是skimage的版本? – bornruffians