2011-02-02 3 views
2

Pls. 이것이 가사 일을하는 질문이 아니라, 내가하고있는 일과 내가 필요한 조언이있는 곳을 주목하라.이미지 배열의 패딩을위한 로직

2 차원 이미지가 1D 배열 (행 주요 순서)에 저장되어 있습니다. 이 이미지를 상단의 패딩 1 행, 하단의 1 행, 오른쪽의 패딩 1 열, 이미지의 1 열 왼쪽으로 테두리 픽셀 복제로 패딩해야합니다. C 코드에서이 작업을 수행하려고합니다.

아래에 표시된 img []와 같이 1D 배열에 저장된 2D 이미지를 고려하십시오. 실제 이미지는 크기가 3x4 (4 행 3 열)이고 양방향 (위/아래/왼쪽/오른쪽)에서 1 행 및 1 열 패딩 한 후 최종 이미지 크기는 5x6 (6 행, 5 열)입니다. 제 경우

int img[30] = {0,0,0,0,0,0,1,2,3,0,0,4,5,6,0,0,7,8,9,0,0,10,11,12,0,0,0,0,0,0}; 

패딩의 크기는 공지 된 상단과 하단에 단 1 행 1 열의 우측 이미지의 좌측된다. 그래서 내가 구현 한 한 가지 방법은 지정된 이미지 배열의 픽셀 인덱스와 채워진 출력 픽셀 인덱스 간의 매핑을 만드는 것입니다. 미리 계산 된 조회 테이블에이 매핑을 저장하고 패딩 논리에이 테이블을 사용했습니다.

과 같아야 출력을 패딩 후 : 내가 만든

int img[30] = {1,1,2,3,3,1,1,2,3,3,4,4,5,6,6,7,7,8,9,9,7,7,8,9,9}; 

조회 테이블했다 : -

int lut[6,6,7,8,8,...]; 

이 테이블을 사용하여 다음과 같이

for(i=0;i<30;i++) 
{ 
img[i] = img[lut[i]]; //something on this lines... 
} 

하지만를 조회 테이블 기반 met를 사용하는 것보다 프로그램 적으로이 이미지 패딩 로직을 구현하는 데 관심이 있습니다. 벽돌 상자. 즉, 런타임에 코드에서 픽셀 인덱스를 계산하려고합니다. EDIT : 또한 추가 된 패딩 된 행/열에 대해 저장소를 제공하는 것과 동일한 위치에 패딩 된 이미지를 가져와야합니다.

코드가 어떻게 보이는지 모든 포인터.

감사합니다. 방금 복사, 배열 내 주변의 모든 데이터를 이동하지 않아도 - 당신의 이미지가 이미 대상 배열 내 정확한 위치에 위치하므로

-AD

답변

5
#include <stdio.h> 

void pad_image(int* img, int cols, int rows) 
{ 
    for(int i = 0 ; i < cols ; ++i) 
    { 
     // top and bottom 
     img[i]    = img[i+cols]; 
     img[i+cols*(rows-1)] = img[i+cols*(rows-1)-cols]; 
    } 
    for(int j = 0 ; j < rows ; ++j) 
    { 
     // left and right 
     img[j*cols]  = img[j*cols+1]; 
     img[j*cols+cols-1] = img[j*cols+cols-2]; 
    } 
} 

int main(int argc, char** argv) 
{ 
    int img[30] = {0,0,0,0,0,0,1,2,3,0,0,4,5,6,0,0,7,8,9,0,0,10,11,12,0,0,0,0,0,0}; 
    for(unsigned int i = 0 ; i < 30 ; ++i) 
     printf("%d ",img[i]); 
    printf("\n"); 
    pad_image(img,5,6); 
    for(unsigned int i = 0 ; i < 30 ; ++i) 
     printf("%d ",img[i]); 
    printf("\n"); 
} 
+0

아주 좋아요. 논리를 이해하기 위해, 그리고 그것도 주()와 함께!! 고맙습니다. – goldenmean

3

이 합리적으로 간단하다.

다음 함수는 패딩 된 크기 (예제에서는 pad_image(img, 5, 6);)와 함께 호출됩니다. 채워진 행을 반복하고 첫 번째 열과 마지막 열을 채 웁니다. 그런 다음 채워진 첫 번째 및 마지막 채워진 행을 복제합니다.

#include <string.h> 

void pad_image(int img[], int n_cols, int n_rows) 
{ 
    int row; 

    if (n_cols < 3 || n_rows < 3) 
     return; 

    for (row = 1; row < (n_rows - 1); row++) 
    { 
     /* Duplicate first column in this row */ 
     img[row * n_cols] = img[row * n_cols + 1]; 
     /* Duplicate last column in this row */ 
     img[row * n_cols + n_cols - 1] = img[row * n_cols + n_cols - 2]; 
    } 

    /* Duplicate first row */ 
    memcpy(&img[0 * n_cols], &img[1 * n_cols], n_cols * sizeof img[0]); 
    /* Duplicate last row */ 
    memcpy(&img[(n_rows - 1) * n_cols], &img[(n_rows - 2) * n_cols], n_cols * sizeof img[0]); 
} 
+0

이 요소 복사 작업의 적은 수의 측면에서 약간 더 최적 보인다! 고맙습니다. – goldenmean