2014-05-22 2 views
1

numpy에서 3 차원 색상 값 (각 픽셀이 RGB 색상 인 이미지를 나타내는 데 2d)을 사용하고 세피아 필터를 적용하려고합니다 . 색상을 가정하면 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)의 표준 이미지 배열 조직을 가정 할 때, 당신은 사용할 수 있습니다 numpy 직접 상자에서 매트릭스 곱셈.

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

나는 배열이 다른 크기입니다 (적어도 NumPy와 1.6.1에서이와 0.9.0을 scipy) 때문에 나를 위해'1.6.1'에 – bornruffians

+0

작품을 작동하지 않습니다() 호출이 img.dot 생각 . 이 코드는 복사 + 붙여 넣기가 가능합니다. 시도 해봐! 행렬은 같은 크기로 곱셈 될 필요가 없습니다. 필요한 것은 두 개의 해당 축 *입니다. 하나는 첫 번째 행렬에, 두 번째 행렬에는 하나씩 있습니다. 이 경우는 다음과 같다 :'img'의 마지막 (색상 -) 축은 길이가 3이고'sepia_filter.T' 축은 0이다. 'numpy.dot'를 직접 사용할 수 있습니다. 첫 번째 배열의 마지막 축과 두 번째 배열의 두 번째 - 마지막 축을 사용하기 때문에 상자에서 바로 사용할 수 있습니다. 하나 또는 여러개가 필요하다면'np.tensordot'를 사용할 수 있습니다 – eickenberg

+1

"ValueError : 행렬이 정렬되지 않았습니다."라는 오류 메시지가 나타납니다. 이미지의 흑백 버전을 사용하고 있기 때문에 이미지가 아닌 이미지가 사용되었을 수 있습니다. – bornruffians