2013-03-14 1 views
0

이미지를 2로 다운 샘플링하려합니다. 이미지는 그레이 스케일이라고 가정 했으므로 한 채널에서만 작동하므로 평균 4 픽셀을 시도한 다음 결과를 destImage에 넣습니다. destImage를 올바르게 채울 방법을 모르겠습니다. 친절 여기에 코드를 찾을 : 나는 당신이 그렇게 단지의 경우, Qt를을 사용하는 당신은 바퀴를 재발견 할 필요가 없습니다 참조이미지 다운 샘플

void downsizeRow(unsigned char *srcImage, unsigned char *dstImage, int srcWidth) 
{ 

    unsigned char *srcPtr = srcImage; 
    unsigned char *dstPtr = dstImage; 

    int stride = srcWidth; 
    int b; 
    for (int i = 0; i< 4; i++) 
    { 

     b = srcPtr[0]+srcPtr[1] + srcPtr[stride + 0] + srcPtr[stride + 1] ; 

     srcPtr++; 
     dstPtr[0] = (uint8_t)((b + 2)/4);; 
     dstPtr++; 
    } 

} 

void downscaleImage(unsigned char *srcImage, unsigned char *dstImage, int srcWidth, int dstHeight, int dstWidth) 
{ 

    unsigned char *srcPtr=srcImage; 
    unsigned char *dstPtr=dstImage; 

    int in_stride = dstWidth; 
    int out_stride = dstHeight; 

    for (int j=0;j<dstHeight;j++) 
    { 
     downsizeRow(srcPtr, dstPtr, srcWidth); // in_stride is needed 
     // as the function requires access to iptr+in_stride 
     srcPtr+=in_stride * 2; 
     dstImage+=out_stride; 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    unsigned char srcimage[4*4]; 
    unsigned char dstimage[2*2]; 


    for (int i = 0; i<4*4; i++) 
    { 
     srcimage[i] = 25; 
    } 
    std::cout<<"source Image \n"<<std::endl; 
    for (int i = 0; i<4*4; i++) 
    { 

     std::cout<<srcimage[i]; 
    } 

    downscaleImage(srcimage, dstimage, 4,4,2); 
    std::cout<<"dest Image"<<std::endl; 
    for (int i = 0; i<2*2; i++) 
    { 

    // std::cout<<dstimage[i]; 
    } 

    return a.exec(); 
} 
+0

수동으로 수행해야합니까? – dtech

+0

읽는 이미지의 유형은 무엇입니까? – Alex

+0

자세한 내용을 찾으십시오. 결과가 정확히 무엇입니까? – Shahbaz

답변

1

코드에 많은 잘못이 없습니다. 기본적으로 읽기/쓰기 포인터 위치를 올바르게 추적합니다 (스트라이드를 사용하여 업데이트해야 함). 이렇게하려면 두 개의 중첩 루프를 사용해야합니다. (+ 분배기를 4로 고정하십시오).

한 번에 한 행을 처리하면 속도가 떨어지지 만 다양한 커널 ()을 더 쉽게 통합 할 수 있습니다.

iptr=input_image; in_stride = in_width; 
optr=output_image; out_stride = out_width; 
for (j=0;j<out_height;j++) { 
    process_row(iptr, optr, in_width); // in_stride is needed 
    // as the function requires access to iptr+in_stride 
    iptr+=in_stride * 2; 
    optr+=out_stride; 
} 
+0

당신에 따라 코드를 업데이트했습니다. 이 모든 것이 지금 정확합니까? – Andre

+0

아니요 - 나도 당신이 알아낼 수있는 오류가있었습니다. 'optr = output_image;'자연스럽게. 두 가지 누락 된 점은 입력/출력 이미지에서 보폭이 다르다는 것입니다. 또한 process_row 함수에서 매 단계마다'iptr + = 2; '로 진행해야합니다. 이것은 외부 루프에'iptr + = in_stride * 2; '가있는 것과 같은 이유 때문입니다. –

1

을 QImage 크기 조정 할 것입니다 편리한 함수 (효과적으로 다운 샘플링)에있다 당신.

QImage smallImage = bigImage.scaled(bigImage.width()/2, bigImage.heigth()/2, Qt::KeepAspectRatio, Qt::SmoothTransformation); 

QImage가 너무 느린 경우 일반적으로 더 빠른 QPixmap을 사용해 볼 수도 있습니다.

Qt::SmoothTransformation을 생략하면 기본값이 Qt::FastTransformation으로 줄어들어 더욱 빨라집니다.

+0

불행히도 QT를 사용하고 싶지 않습니다 ... – Andre

+0

@Mahmoud - 천천히 무엇을 의미합니까? 시험 했니? 결과가 있습니까? – dtech