我需要使用 CImg 库计算图像的平均值,如下所示:
int i = 0;
float mean = 0;
CImg<float> img("image.cimg");
float *ptr = img.data(); //retrieves pointer to the first value
while(i<img.width()*img.height()*img.spectrum()){
mean += *(ptr+i);
++i;
}
std::cout << "mean: " << mean/i << std::endl;
我知道这样img.mean()
可以解决问题,但是在这里我想以低级别的方式进行。
当图像的大小增加太多时,我的代码中的第 3 行会消耗我计算机的太多资源,因为根据文档,它同时将所有图像像素存储在内存缓冲区中。
我想到了一个更低级别的解决方案,使用系统调用open()
,read()
如下所示:
int i = 0;
int k = WIDTH*HEIGHT*SPECTRUM; //assuming this values are known
float mean = 0, aux;
int fd = open("image.cimg", O_RDONLY);
while(i<k){
read(fd, &aux, sizeof(float));
mean += aux;
++i;
}
close(fd);
std::cout << "mean: " << mean/i << std::endl;
但是现在得到的结果没有任何意义。我想知道这个解决方案是否有任何意义,如果图像以与在内存中加载时相同的方式存储在磁盘上,以及最终这个解决方案是否会节省时间和内存。