Мне нужно вычислить среднее значение изображения с помощью библиотеки 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()
поможет, но здесь я хочу сделать это низкоуровневым способом.
Когда размер изображения увеличивается слишком сильно, третья строка моего кода потребляет слишком много ресурсов моего компьютера, потому что согласно documentation одновременно сохраняет все пиксели изображения в буфере памяти.
Я подумал о решении еще более низкого уровня, используя системные вызовы 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;
Но полученные сейчас результаты не имеют никакого смысла. Интересно, имеет ли это решение вообще какой-либо смысл, если изображение хранится на диске так же, как и при загрузке в память, и сэкономит ли в конце концов это решение время и память или нет.
CImg
-c'tor знает, как это читать, и предоставляет соответствующие номера (img.width()
и т. д.). Ваше наивное решение читает заголовок, как будто это данные изображения, и делает другие предположения о макете, которые могут быть неверными. - person IInspectable   schedule 26.11.2013