2016-10-17 4 views
0

이미지마다 각 열의 최대 값이 이미지의 가운데에 세로로 표시되도록 각 열을 오프셋하고 싶은 이미지가 있습니다.이미지 열을 최대 값으로 정렬

unaligned = np.array([[0,0,1,2,3,2,1,0,0,0], 
         [0,0,0,1,2,3,2,1,0,0], 
         [0,1,2,3,4,3,2,1,0,0], 
         [0,0,1,2,3,2,1,0,0,0], 
         [0,0,0,1,2,3,2,1,0,0]]).T 

enter image description here

일단 정렬, 그것은 내가 열을 기준으로 열을 이동 최대 값의 인덱스를 찾을 수

aligned = np.array([[0,0,0,1,2,3,2,1,0,0], 
        [0,0,0,1,2,3,2,1,0,0], 
        [0,0,1,2,3,4,3,2,1,0], 
        [0,0,0,1,2,3,2,1,0,0], 
        [0,0,0,1,2,3,2,1,0,0]]).T 

enter image description here

과 같아야합니다 : 여기에 몇 가지 장난감 데이터입니다 그런 다음 중간 값에서 최대 값을 갖는 새로운 배열로 열을 다시 작성하십시오. 그러나 이것을 수행하는 간결하고 빠른 방법이 있습니까? 특히 수천 개의 열이있는 이미지가있는 경우? 아마도 열 최대 값을 제어 포인트로 사용하는 일부 이미지 처리 루틴일까요?

감사합니다. 우리는 다른 방법과 같이, clippingrow_idx를 얻을 수 있습니다, 당신은 제로 포지션으로 이동하고 열의 끝이 제로가 채우기 위해 시도하는 경우

m,n = unaligned.shape 
col_shifts = m//2 - unaligned.argmax(0) 
row_idx = np.mod(np.arange(m)[:,None]-col_shifts,m) 
aligned_out = unaligned[row_idx,np.arange(n)] 

- -

+0

'np.array'에 중첩 호출을 할 필요가 없습니다. np.array ([[0,1, ...], [...], [...]])'와 같은 중첩 목록은 정상적으로 작동합니다. –

+0

적어도 하나의 연산으로 최대 값을 벡터화 할 수 있습니다. 각 열마다 다른 시프트가 필요하므로 루프를 사용해야 할 수도 있습니다. –

답변

1

여기 broadcasting를 사용하여 접근 방식

row_idx = (np.arange(m)[:,None]-col_shifts).clip(min=0,max=m-1) 
+0

이것은 열의 값을 변경합니다. 이상적으로, 열 데이터를 정렬로 옮겨야합니다. –

+0

@JoeFlip 그게 무슨 뜻인지 잘 모르겠습니다. 이것은 새로운 행 인덱스를 얻고 따라서 각 열을 이동시키는 것입니다. 'clipping '으로 두 번째 접근법을 시도해보십시오. – Divakar

+0

@ Divakar 오, 미안 해요! 나는 오타가 있었어. 네, 잘 작동합니다. 감사! –