下载一个图像样本

Downsample an Image

本文关键字:一个 图像 样本 下载      更新时间:2023-10-16

我试图通过2对图像进行采样,图像我假设它是灰度的,所以我只使用一个通道,我试图平均4个像素,然后将结果放在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();
}

代码中没有太多错误—基本上只是正确地跟踪读/写指针的位置(记得使用strides进行更新)。这需要以某种方式使用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;
}

我看到你正在使用Qt,所以以防万一你不需要重新发明轮子,QImage有一个方便的函数,它将为你做大小调整(有效地降低采样)。

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

如果QImage对你来说太慢了,你也可以尝试使用通常更快的QPixmap。

省略Qt::SmoothTransformation将返回到使用默认的Qt::FastTransformation,这将更快。