2013-05-22 4 views
5

이미지의 픽셀 데이터 배열이 있습니다. 이미지는 이미 270도 회전되었습니다. 그래서 올바른 이미지를 얻기 위해 다시 90도 회전하려고합니다. data[x][y]data[y][x]으로 변경하여 트랜스 포즈 알고리즘을 시도했지만 올바른 방법이라고 생각하지 않습니다. 아무도 나를 돌릴 수있는 방법을 안내 할 수 있습니까?2D 픽셀 배열을 90도 회전

+0

: 회전 +90도에 대한 예를 들어. 프로세스를 병렬화하여보다 신속하게 처리 할 수 ​​있습니다. –

답변

7

In-place matrix transposition (정확히 일치하지 않음)이라는 추가 공간을 사용하지 않고도이 작업을 수행 할 수 있습니다. 조 변경 후에 미러링을 수행하십시오. 이미지가 정사각형이 아닌 행렬 용

  • 사각형이 아닌 경우 화상

    enter image description here

  • 사각형이면

    1. , 알고리즘은 더 복잡하다. 1980 년 이전의 많은 알고리즘은 "follow-the-cycles"알고리즘이라고 할 수 있습니다. 즉, 사이클을 반복하면서 한 위치에서 다음 위치로 데이터를 이동합니다. 의사의 형태 :

enter image description here

14

그런 다음, old_data[rows][cols]new_data[cols][rows] 있습니다

for(int i=0; i<cols; i++) { 
    for(int j=0; j<rows; j++) { 
     new_data[i][j] = old_data[rows-1-j][i]; 
    } 
} 

이 90도 CW에 의해 old_data 회전한다.

+0

이미지가 사각형이 아닌 경우 작동합니까? – noob

+0

예. 그것은 할 것이다. 나는 이것을 작은 매트릭스로 시도했다. :) 입력 이미지의 순서가 MxN인지, 출력 이미지의 순서가 NxM인지 확인하십시오. –

+0

고마워, 지금 이걸 시도하고있어. – noob

5

이 자리에서 O (1) 공간을 함께하고 싶어, 당신은이 작업을 수행 할 수 있습니다

  1. 매트릭스 트랜스 data[i][j]data[j][i]을 교환하여 :

    for (int i = 0; i < n; i += 1){ 
        for (int j = i+1; j < n; j += 1){ 
         swap(data[i][j], data[j][i]); 
        } 
    } 
    
  2. 각 행 또는 열을 +90 또는 -90도 회전 할 때 각각을 반대로합니다. 유일한 방법이다

    for (int i = 0; i < n; i += 1){ 
        for (int j = 0; j < n/2; j += 1){ 
         swap(data[i][j], data[i][n-1-j]); 
        } 
    } 
    
관련 문제