2013-03-14 109 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