Мне нужно прочитать в .bmp-файле как 2D-массив его значений оттенков серого, чтобы я мог анализировать значения каждого пикселя. Я никогда ничего не делал с файлами изображений, поэтому я понятия не имею, с чего начать. Может ли кто-нибудь предложить удобное для начинающих объяснение того, как это сделать? Все, что мне нужно, это преобразовать файл .bmp в двумерный массив целых чисел, представляющий значение оттенка серого пикселя.C++ получить массив оттенков серого из .bmp-файла
ответ
unsigned char* readBMP(char* filename)
{
int i;
FILE* f = fopen(filename, "rb");
unsigned char info[54];
fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header
// extract image height and width from header
int width = *(int*)&info[18];
int height = *(int*)&info[22];
int size = 3 * width * height;
unsigned char* data = new unsigned char[size]; // allocate 3 bytes per pixel
fread(data, sizeof(unsigned char), size, f); // read the rest of the data at once
fclose(f);
unsigned char* dataGrayScale = new unsigned char[width*height];
int counter = 0;
for(i = 0; i < size; i += 3)
{
dataGrayScale[i] = (data[i]+data[i+1]+data[i+2])/3 //the avg of the rgb is the grayscale value
counter++;
}
delete [] data;
return dataGrayScale;
}
Итак, если я правильно понимаю, здесь я могу получить доступ к каждому значению пикселя из 'dataGrayScale [width * height]'? Если это так, то –
Среднее значение красного, зеленого и синего каналов не обязательно означает значение оттенков серого. См. [Эту ссылку] (https://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale) для получения более подробной информации. – dreamlax
-1, потому что этот код делает радикальные обобщения о входном файле (он предполагает, что вход является конкретным форматом). Он также принимает конечность главной машины. Также нет подтверждения для ввода. – dreamlax
Есть две части этой проблемы: 1. чтение в BMP-файле; 2. Преобразование из RGB в оттенки серого. Обе части имеют ответы здесь на StackOverflow. –
Существует несколько библиотек изображений, доступных для вас, включая некоторые, которые будут конвертировать из полного цвета в оттенки серого. К сожалению, ваш вопрос в настоящее время слишком широк для StackOverflow. – dreamlax