下载一个图像样本
Downsample an Image
我试图通过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
,这将更快。
相关文章:
- 如何在 OpenCV 中将图像与另一个图像相关联
- 计算另一个图像像素满足条件的像素值的平均值
- 由于alpha值的原因,将一个图像混合到另一个图像会产生不正确的图像
- 访问和更改基于另一个图像的像素颜色-opencv c++
- 如何在打开另一个图像时关闭图像 - linux c ++
- 在 allegro5 中的另一个图像上的图像 (C++)
- SFML 将图像从 txt 文件加载到矢量中仅加载最后一个图像
- sfml pollevent,每个新图像都会删除上一个图像
- 尝试在另一个 SDL2 上显示一个图像没有错误,但不会显示第二个图像
- 如何使用CIMG.H库在另一个图像上显示一个图像
- 这个opencv程序用于同时从一个文件夹中加载不同的图像,但它只读取一个图像
- QPixmap将绘制的正方形的内容复制到另一个图像中
- 确定一个图像是否在其他图像中的最佳方法 - opencv c ++
- 确保给定的图像被另一个图像翻转
- OpenCV将透明图像绘制到另一个图像上
- 如何使用opencv中的单应矩阵将一个点从一个图像重新投影到另一个图像
- 如何使用OpenCV在一个窗口中显示一个图像和一个视频
- 一个图像识别特征金字塔有多少步
- 如何从资源中的图像数组中获得一个图像的HBITMAP
- 如何将一个图像叠加在另一个图像上?c++