2016-06-13 3 views
3

몇 가지 검색을했지만 정확히 동일한 질문을 찾지 못했습니다. 해결책을 찾지 못했습니다.이미지에 행렬을 적용하는 방법

숫자 모양의 배열로 표시되는 이미지가 있습니다. (l1,l2,3) 여기서 l1, l2는 정수이고 RGB는 3입니다.

그리고 이유를 들어서, 나는 기초를 바꾸고 싶습니다, 그것은 모든 RGB 벡터에 행렬 P를 적용하는 것을 의미합니다. P의 모양은 (3,3)입니다.

def change_base(Image,P): 
    Image_copie=np.zeros(Image.shape) 

    for i in range(Image_copie.shape[0]): 
     for j in range(Image_copie.shape[1]): 
      Image_copie[i,j]=np.dot(P,Image[i,j]) 

    return Image_copie 

그것은 분명히 작동하지만, 추한 매우 느린 :

나는이 서면으로 작성했습니다.

너희들은 어쩌면 numpy를 사용하는 어떤 해결책이 있니? opencv ..를 사용하지 않습니다!

감사합니다.

+0

그것은 3 × 3 행렬, 기초 변화 매트릭스 – Gericault

+0

그래서,의 게시 된 솔루션을했다 너를 위해 일해? – Divakar

답변

0

두 입력및 P의 마지막 축을 줄입니다. 그래서, 당신과 같이, np.tensordot을 사용할 수 있습니다 -

np.tensordot(Image,P,axes=(-1,-1)) 

이것은 또한 이전과 이후에 약간의 재편과 np.dot로 표현 될 수 있으므로처럼 -

Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,)) 

하나 또한 A에 대한 np.einsum을 사용할 수 있습니다 축소 작업, 그래서 같은 - 성능

np.einsum('ijk,lk->ijl',Image,P) 

, 아니 축 정렬 요구 사항, 전적으로 감소 작동되고, dot-based 대용량 어레이의 경우 솔루션이 더 빠르지 만 작지만 적당한 크기의 어레이는 einsum이 더 좋을 수 있습니다.

런타임 테스트

사례 # 1 :

In [46]: # Inputs 
    ...: Image = np.random.randint(0,255,(256,256,3)) 
    ...: P = np.random.randint(0,255,(3,3)) 
    ...: 

In [47]: %timeit change_base(Image,P) 
    ...: %timeit np.tensordot(Image,P,axes=(-1,-1)) 
    ...: %timeit Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,)) 
    ...: %timeit np.einsum('ijk,lk->ijl',Image,P) 
    ...: 
1 loops, best of 3: 206 ms per loop 
100 loops, best of 3: 3.28 ms per loop 
100 loops, best of 3: 3.22 ms per loop 
100 loops, best of 3: 3.06 ms per loop 

사례 # 2 :

In [48]: # Inputs 
    ...: Image = np.random.randint(0,255,(512,512,3)) 
    ...: P = np.random.randint(0,255,(3,3)) 
    ...: 

In [49]: %timeit change_base(Image,P) 
    ...: %timeit np.tensordot(Image,P,axes=(-1,-1)) 
    ...: %timeit Image.reshape(-1,3).dot(P.T).reshape(Image.shape[:2]+(-1,)) 
    ...: %timeit np.einsum('ijk,lk->ijl',Image,P) 
    ...: 
1 loops, best of 3: 845 ms per loop 
100 loops, best of 3: 12.8 ms per loop 
100 loops, best of 3: 12.7 ms per loop 
100 loops, best of 3: 13.4 ms per loop 
관련 문제