1

다음 C 코드를 처리하는보다 빠른 방법을 찾고 있습니다. 나는 640x480의 이미지를 가지고 있으며, 이미지의 다른 모든 행과 열을 제거함으로써 2의 요소로 그것을 줄이고 싶습니다. 다음 코드를 첨부했습니다. 코드를 최적화하는 더 좋은 방법이 있습니까?더 빠른 (최적화 된) 이미지 데시 메이션 솔루션 (C++)

int outputIndex; 
int inputIndex; 
for (int p = 0; p< OUTPUT_NUM_ROW; p++) { 
    inputIndex = p * INPUT_NUM_COL * 2; 
    outputIndex = p * OUTPUT_NUM_COL; 
    for (int q = 0; q < OUTPUT_NUM_COL; q++) { 
     outputImage[outputIndex] = inputImage[inputIndex]; 
     inputIndex += 2; 
     outputIndex++; 
     // cout << "The pixel at " << p*OUTPUT_NUM_COL+q << " is " << outputImage[p*OUTPUT_NUM_COL+q] << endl; 
    } 
    } 
} 

당신은 너무 복사 할당 인라인 증가 할 수 있고, 당신은 또한 단지 inputIndex을 지정할 수 있습니다 :

#define INPUT_NUM_ROW 480 
#define INPUT_NUM_COL 640 
#define OUTPUT_NUM_ROW 240 
#define OUTPUT_NUM_COL 320 

unsigned char inputBuf[INPUT_NUM_ROW* INPUT_NUM_COL]; 
unsigned char outputBuf[OUTPUT_NUM_ROW* OUTPUT_NUM_COL]; 

void imageDecimate(unsigned char *outputImage , unsigned char *inputImage) 
{ 
/* Fill in your code here */ 
for (int p = 0; p< OUTPUT_NUM_ROW; p++) { 
    for (int q = 0; q < OUTPUT_NUM_COL; q++) { 
     outputImage[p*OUTPUT_NUM_COL + q] = inputImage[(p*INPUT_NUM_COL+q)*2]; 
     // cout << "The pixel at " << p*OUTPUT_NUM_COL+q << " is " << outputImage[p*OUTPUT_NUM_COL+q] << endl; 
    } 
    } 
} 
+0

대부분의 이미지에는 업데이트해야 할 헤더 입력란이 많이 있습니다. 게시 된 코드는 실제 데이터/픽셀 필드 만 처리합니다. 대부분의 픽셀 필드는 3 또는 4 바이트 길이입니다 (헤더 정보에 따라 다름). 이미지를 압축 할 때 행의 1/2과 열의 1/2을 임의로 제거하지 마십시오. 훨씬 더 나은 접근법은 행 쌍의 평균을 구하는 것입니다. 그런 다음 (별도 루프에서) 평균 열 쌍을 사용하여 각 열 (픽셀)이 3 또는 4 바이트로 구성된다는 것을 기억하십시오. 또한 행의 바이트 수는 4의 배수가 될 것입니다. (대부분의 이미지에서) 행의 바이트 수는 – user3629249

+0

입니다. 이미지에 포함 된 헤더 필드와 픽셀의 평균을 구하면 오른쪽으로 향하게되므로 별칭이 눈에 띄지 않게됩니다. 그러나, 나는 더 많은 코드 최적화를 찾고 있었다. –

답변

1

오히려 내부 루프에서 수학마다하는 것보다, 당신이 할 수 outputIndex를 처음으로 사용했지만 내부 루프에서 계산을 이동하는만큼 성능이 향상되지는 않습니다. 대량 복사 기능에는 이러한 종류의 유연성이 없다고 가정하겠습니다. 그러나 모든 대상 플랫폼에서 사용할 수있는 하드웨어 가속을 사용하면 더 나은 선택이 될 것입니다.

나는 또한 이처럼 배열 접근이 당신이 사용할 수있는 가장 최적화 된 포인터 산술로 컴파일한다고 가정하고있다.

+0

이걸 생각해야합니다! 감사. +1 –

+0

이것은 각 픽셀의 실제 크기를 고려하지 않고 수직으로 이미지를 축소하지 않으며 각 행에 대해 '4 바이트의 배수'요구 사항을 처리하지 않습니다. – user3629249

+0

@ user3629249 - inputIndex와 outputIndex 계산 사이의 2의 차이는 수직으로 데시 메이션을 수행합니다. 행당 총 바이트 수가 4 바이트의 배수가되어야 함을 의미하는 경우 480 및 240에 대한 상수는이를 보장합니다. 대신 픽셀 당 비트 깊이에 대해 이야기하고 있다면 픽셀 당 32 비트 이미지이고 픽셀 당 4 바이트가 필요하다는 것은 밝혀지지 않았습니다. 나는 그것이 픽셀 당 8 비트 이미지라는 질문 만 할 수 있었다. –