2013-03-14 61 views
0

我想下采樣的圖像2,圖像我認爲它是灰度,所以我將只與一個通道工作,我試圖平均4個像素,然後把結果在destImage。我不知道如何正確填充destImage。請在這裏找到代碼:降採樣圖像

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 2013-03-14 10:46:25

+0

您閱讀的圖像的類型是什麼? – Alex 2013-03-14 10:46:36

+0

嘗試更具體。結果究竟有什麼錯誤? – Shahbaz 2013-03-14 10:47:04

回答

1

代碼中沒有太多錯誤 - 基本上只是保持正確的讀/寫指針位置跟蹤(記得用步幅更新)。這需要以不同的方式使用2個嵌套循環。 (+將分隔線固定爲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 2013-03-14 12:18:34

+0

不 - 我也有一個錯誤,你設法找出。 'optr = output_image;'自然。缺少的兩件事是輸入/輸出圖像的步幅不同。而且,在process_row函數中,您必須前進到'iptr + = 2;'每一步。這是出於同樣的原因,在外部循環中有'iptr + = in_stride * 2;'。 – 2013-03-14 12:46:37

1

我看你使用的是Qt,所以萬一你並不需要推倒重來,而QImage有會做一個調整方便功能(有效降採樣)的您。

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

如果QImage對你來說太慢,你也可以嘗試使用通常更快的QPixmap。

省略Qt::SmoothTransformation將回退到使用默認Qt::FastTransformation,這將更快。

+0

不幸的是,我不想使用QT,它的速度很慢... – Andre 2013-03-14 13:33:22

+0

@Mahmoud - 你是什麼意思慢?你測試了嗎?你有結果嗎? – dtech 2013-03-14 14:11:43