2010-11-20 9 views
5

저는 Sing-Value 분해와 관련된 Calc III 코스의 프로그래밍 프로젝트를 진행하는 대학의 CS 전공자입니다. 아이디어는 기본적으로 m x n 차원의 이미지를 m x n 행렬로 변환하는 것입니다. 여기서 각 요소는 점 (m, n)에서 픽셀의 색상 채널 (r, g, b)을 나타내는 튜플입니다. 저는 파이썬을 사용하고 있습니다. 왜냐하면 지금까지 (잘) 가르쳐 온 유일한 언어이기 때문입니다.Python - NumPy - 배열 요소로 튜플

파이썬은 일반적으로 튜플을 배열 요소로 사용하지 않습니다. 난 내 자신의 작은 연구를 다음과 같이 즉, 배열을 미리 할당 해결, 발견

def image_to_array(): #converts an image to an array 
    aPic = loadPicture("zorak_color.gif") 
    ph = getHeight(aPic) 
    pw = getWidth(aPic) 
    anArray = zeros((ph,pw), dtype='O') 
    for h in range(ph): 
     for w in range(pw):    
      p = getPixel(aPic, w, h) 
      anArray[h][w] = (getRGB(p)) 
    return anArray 

이가에 이미지를 변환하는 간단했다 과제의 첫 번째 부분, 제대로 일을 행렬 (선형 대수가 포함되지 않음).

SVD가있는 부분은 까다로워집니다. 나는 호출 할 때 내장 된 NumPy와의 SVD 기능 (각 요소 튜플은) 내 이미지에서 내장 배열, 나는 다음과 같은 오류를 사용하여이 같은 오류가 나는 처음에지고 있다고한다

Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in -toplevel- 
    svd(x) 
    File "C:\Python24\Lib\site-packages\numpy\linalg\linalg.py", line 724, in svd 
    a = _fastCopyAndTranspose(t, a) 
    File "C:\Python24\Lib\site-packages\numpy\linalg\linalg.py", line 107, in _fastCopyAndTranspose 
    cast_arrays = cast_arrays + (_fastCT(a.astype(type)),) 
ValueError: setting an array element with a sequence. 

전에 일부 연구를 수행하고 튜플을 요소로 사용할 수 있도록 배열을 미리 할당 할 수 있다는 것을 알았습니다.

이제는 (대학 수준) 프로그래밍의 첫 학기에만 해당되며, 전문 프로그래머가 작성한이 numPy 함수는 나에게 너무 까다로운 상자입니다. 경험이있는 사람들에게는 훨씬 더 명확합니다). 따라서 튜플을 허용하기 위해 이러한 함수를 편집하는 것은 내 자신의 함수로 수행했을 때보 다 조금 더 복잡합니다. 여기서 어디로 가야합니까? 나는 관련 numPy 함수를 내 자신의 프로그램에 복사하고 이에 맞게 수정해야한다고 가정한다.

미리 감사드립니다.

+3

SVD는 행렬에서 작동 :

예를 들어, (즉 튜플의 첫 번째 요소입니다 가정) "R"행렬의 SVD를 원하는 경우

는 같은 것을 사용합니다. RGB 채널 각각에 대해 SVD를 수행 할 계획입니까? 즉, m x n x 3 배열을 형성하더라도 임의의 크기의 텐서가 아닌 행렬에 대해 SVD가 정의되므로 SVD 함수에 전달할 수 없습니다. –

답변

2

나는 ph에 의해 pw에 의해 3 numpy 배열을 생각합니다.

anArray = zeros((ph,pw,3)) 
for h in range(ph): 
    for w in range(pw):    
     p = getPixel(aPic, w, h) 
     anArray[h][w] = getRGB(p) 

당신은 getRGB 터플 대신 3 요소 목록을 반환 있는지 확인해야합니다.

+0

물론, 그 정도면 충분합니다. getRGB 주위에 list()를 넣었습니다. 하지만 변경 한 후에는 새로운 오류가 발생했습니다. 파일 "C : \ Python24 \ Lib \ site-packages \ numpy \ linalg \ linalg.py", 720 행, svd _assertRank2 (a) 파일 " C : \ Python24 \ Lib \ site-packages \ numpy \ linalg \ linalg.py ", 줄 116, _assertRank2에서 제기 LinAlgError, '주어진 d 차원 배열 %. 배열은 \ 이어야합니다. LinAlgError : 3 차원 배열이 지정되었습니다. 배열은 2 차원 이어야합니다. 그래서 numPy와 함께 작동하는 튜플의 "2-d"행렬을 가질 필요가 있습니다. – Thomas

+0

두 번째 생각에서이 말이 실제로 의미가 없습니다. 나는 항목이 튜플 인 2D 행렬의 SVD를 찾을 수 없다고 생각합니다. 3D 행렬의 SVD와 같은 것이 있다면 그것은 분명히 제 수업과이 프로젝트의 범위를 벗어납니다. 각 색상 채널에 대해이 작업을 수행하는 방법을 파악한 다음이 세 가지 행렬을 어떻게 든 결합해야합니다. 답변 해 주셔서 감사합니다. – Thomas

+0

SVD [DeLathauwer 2000] [Mesgarani 2004]의 3D 버전이 있습니다. 그러나 당신이 원하는 것은 아닌 것 같습니다. 얼굴 인식과 같은 작업에서 사람들은 종종 전체 이미지 *를 벡터화 한 다음 벡터를 크기 (h * w)의 큰 행렬 'X'(num 이미지)로 연결 한 다음 X에서 PCA를 수행합니다 'XX^T'의 SVD와 동일합니다. 나는 여기에 관련된 질문에 대답했다 : http://stackoverflow.com/questions/4171866/creating-a-dataset-from-an-image-with-python-for-face-recognition/4176400#4176400 –

7

배열 요소 유형을 'O'(개체)로 설정하는 대신 튜플로 설정해야합니다. 몇 가지 예는 the SciPy manual을 참조하십시오. 귀하의 경우에는

는 가장 쉬운

a = zeros((ph,pw), dtype=(float,3)) 

이 RGB 값이 3 개 부동 소수점 숫자의 튜플이다 가정 같은 것을 사용하는 것입니다.

k는 튜플 요소이고 실제로 튜플 요소 a[n,m][k] 또는 z[n,m,k]으로 액세스되는, 3 차원 배열을 생성 (스티브 제안)과 유사하다.

물론 SVD는 3D 배열이 아닌 2 차원 행렬에 대해 정의되므로 linalg.svd (a)를 사용할 수 없습니다. 당신은 필요한 행렬 (R G와 B)의 SVD를 결정해야합니다.

linalg.svd(a[:,:,1])