2014-09-15 4 views
4

나는 여러 단계를 거쳐 색상환 주위의 이미지 색상을 이동시키는 스크립트를 만들었습니다.이미지 처리를위한 번프 조작

PIL을 사용하여 이미지를 가져 와서 Numpy 배열로 변환하면이 모양 (x, y, (r, g, b))이됩니다.

이 배열을 Skimage 색상 모듈을 사용하여 RGB에서 HSV 색상 공간으로 변환합니다 (RGB 값을 범위 [0,1.0]으로 스케일 한 후).

내가 겪고있는 문제는 모든 픽셀에 대해 HSV 값 (H, S 또는 V 중 하나) 만 조작한다는 것입니다. 배열의 모든 '픽셀'에 대해 이러한 3 차원 중 하나를 효율적으로 추가, 곱하거나 뺍니다.

는 내가 세 가지 별도의 배열로 HSV 값을 분할하여 작동하도록 입수했습니다

: h,s,v = np.dsplit(hsv,3)

방법으로 배열을 조작은 내가 원하는 : h_new = np.multiply(h,.33)

다음 배열 재 조립 : hsv_new = np.stack((h_new,s,v))

이렇게하는 것이 가장 효율적인 방법이 아니므로 제 질문은 : 이러한 치수를 어떻게 조작 할 수 있습니까? 배열을 청크로 나눕니까?

답변

2
hsv[:,:,0] *= 0.33 

hsv 인플레 이스의 h 구성 요소를 수정합니다.

hsv[:,:,0]hsv의 "기본 슬라이스"이므로 원래 배열의 보기입니다.


h, s, v = np.dsplit(hsv, 3) 

3 개 새로운 배열 h, s, hsv 데이터를 복사 v를 생성한다. h, s, v을 수정해도 hsv에 영향을주지 않습니다. 따라서 h을 수정하려면 hsv을 다시 작성해야합니다. 따라서 더 느립니다.

표기의 편의를 위해

, 당신은

h, s, v = hsv[:,:,0], hsv[:,:,1], hsv[:,:,2] 

그런 h, sv 될 것 hsv의보기 및 수정과

h,s,v = np.dsplit(hsv, 3) 

을 대체 할 수 h, sv 자동 것이다 hsv 그 자체에 영향을 미칩니다. (따라서 hsv_new = np.stack((h_new,s,v))은 필요 없습니다.)


참고 또한 h,s,v = np.dsplit(hsv, 3)h, sv 모양 (n, m, 1)을 가지고 있습니다.

h, s, v = hsv[:,:,0], hsv[:,:,1], hsv[:,:,2] 

가 만드는 반면 h, sv 형상 (n, m)있다. 그건 당신의 다른 코드에 조금 영향을 미칠지 모르지만 전반적으로 나는 후자가 더 좋다고 생각합니다.

+0

우수! 감사! 비슷한 것을하지만'hsv [:] [:] [0]'표기법을 사용하여 할 때 특히 혼란 스러웠습니다. 우연히 'hsv [:] [:] [0]'과'hsv [:, :, 0]'의 차이를 아십니까? – sabjorn

+0

'hsv [:]'는 전체 배열'hsv'의 뷰입니다. 그들은 'hsv [:]는 hsv가 아니라는 점에서 동일한 객체는 아니지만 동일한 기본 데이터를 공유합니다. 'hsv [:]. shape'는'hsv.shape'와 같습니다. ''hsv [:] [:]'와 같은 이야기. 모양을보고 모든 것이 명확해야합니다. – unutbu

+0

두 번 감사드립니다! – sabjorn