Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/33: Рейтинг темы: голосов - 33, средняя оценка - 4.73
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
1

Создание изображения на stm32 с 16 битными градациями серого

01.07.2021, 18:03. Показов 6344. Ответов 66

Author24 — интернет-сервис помощи студентам
Необходимо средствами stm32f746 обработать массив данных, снятый с датчиков, преобразовав его в изображение.
Размер массва MxN примерно 64000 пикселей, это усредненное значение, которое будет задаваться. Т.е. по сути после извлечения данных с детекторов в ОЗУ мк будет находиться массив размером MxN из 16 битных чисел.
Из форматов изображений, работающих с 16 bit grayscale я нашел только PNG и TIFF. Там еще есть что-то про BMP и RAW. В целом не особо критично какой будет формат, но ввиду того, что потом этот файл будет обрабатывать ПО на ПК, то желателен TIFF. Ну либо получить PNG, потом его преобразовать в TIFF, главное сохранить глубину цвета серого 16 бит.
Полученный файл надо передать клиенту (браузер пк), мк - http сервер. Там его скачать.
Я уже переискал, по-моему, все возможные варианты как это можно сделать. Тут изначально выбор где осуществлять конвертацию массива в файл: на строне мк или в браузере. По-хорошему делать это лучше в браузере, ввиду большого объема информации и ее обработки, но ничего толкового я не нашел для этого в javascript (страница написана на html и js, передача осуществляется при помощи AJAX по GET запросам). В основном там идут библиотеки для работы с уже созданными файлами, их обработки (pngjs, camvas-to-tiff, webgl). В общем средства для создания PNG или TIFF на js я не нашел.
Поэтому начал искат возможность сделать это на мк. Тут вообще идея была изначально создать структуру этих форматов (PNG или TIFF) и дальше просто заполнять ее данными, но с их структурой я так и не разобрался. Поэтому так же начал искать библиотеки (libpng, libtiff, raw2tiff). Вот первые две очень интересные, документацию на них я нашел, а примеров использования практически нет. Ну и еще есть предположение, что это будет занимать достаточно большой объем ОЗУ, и просто не поместится в памяти мк. Там ОЗУ 320 КБ, но есть FreeRTOS и LWIP, которые занимают больше половины от этого.
Поэтому возникли вопросы, может кто подскажет как решить данную задачу при помощи этих библиотек, ну либо каким другим способом? Буду рад любой идее, потому что уже перегуглил все по этой теме
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2021, 18:03
Ответы с готовыми решениями:

Преобразовать рисунок с градациями серого в бинарный
Яркости пикселей рисунка закодированы числами от 0 до 255 в виде матрицы. Преобразовать рисунок в...

Работа с 16-битными оттенками серого
Здравствуйте. Какие средства в C++ позволяют работать с 16-битными оттенками серого?

Битовые операции с 64 битными числами (STM32)
Доброго Вам всем вечера, пытаюсь прочитать значение переменной unsigned long long при помощи...

Преобразование изображения в градации серого
Нашел! Dim grayscale As New Imaging.ColorMatrix(New Single()() _ { _ ...

66
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
01.07.2021, 19:49 2
Создавай bmp в контроллере - это не сложно. Для проверки накидал генерацию 16-битного grayscale bmp под windows на Delphi:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
uses
  Windows;
 
var
  bmp: packed record
       fh:   BITMAPFILEHEADER;
       ih:   BITMAPV5HEADER;
       data: array[0..65535] of word;
       end=(fh:(bfType:    $4D42;
                bfSize:    sizeof(bmp);
                bfOffBits: sizeof(BITMAPFILEHEADER)+sizeof(BITMAPV5HEADER));
            ih:(bV5Size:        sizeof(BITMAPV5HEADER);
                bV5Width:       256;
                bV5Height:      256;
                bV5Planes:      1;
                bV5BitCount:    16;
                bV5Compression: BI_BITFIELDS;
                bV5SizeImage:   256*256*2;
                bV5RedMask:     $FFFF;
                bV5GreenMask:   $FFFF;
                bV5BlueMask:    $FFFF));
  f,i: dword;
 
begin
  for i:=0 to 65535 do
    bmp.data[i]:=i;
  f:=CreateFileW('B:\1.bmp',GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
  WriteFile(f,bmp,sizeof(bmp),i,0);
  CloseHandle(f);
end.

Затем создал html-страничку
HTML5
1
<img src=1.bmp>
Как ни странно Firefox нормально отобразил такой файл. Битмап во вложении.
Вложения
Тип файла: 7z 1.7z (82.0 Кб, 11 просмотров)
1
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
01.07.2021, 19:58  [ТС] 3
murderer, а есть пример как создать BMP на С в мк? Просто пока не совсем понимаю как происходит создание структуры и ее заполнение средствами мк, так чтобы потом это все можно было передать как файл
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
01.07.2021, 22:06 4
Цитата Сообщение от murderer Посмотреть сообщение
Для проверки накидал
о как! А я в свое время накодил генерацию bmp в дельфях самостоятельно, не подозревая что заголовки лежат в "Windows" - то есть по сути, в (почти) любом Дельфёвом проекте...
Для ТС, конечно, придется еще погуглить на предмет Си-шных эквивалентов этих структур, но это не так и сложно найти.
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
По-хорошему делать это лучше в браузере
вот эту библиотеку смотрели?

PS: вы для начала ответьте - что вам интереснее - копать создание картинок в Си или копать создание картинок в JS? В чем вы лучше разбираетесь?
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
02.07.2021, 05:59  [ТС] 5
Voland_, эту библиотеку не находил. В заголовке темы ошибка, там должно быть "с 16 битными градациями серого", т.е. 65536 градаций. 8 битные абсолютно, ни в каком виде, совсем никак не подходят под задачу.
Нууу, мне интереснее сделать это средствами Си на мк, в программировании мк я лучше разбираюсь чем в js, но вообще выгоднее с позиции рерсоемкости решить задачу средствами js, т.е. в браузере пк, а мк чтобы занимался только накоплением и передачей данных, грузить на него сздание изображения будет не совсем рациональной затеей, но вся проблема в том, что js не представяет особо средств для создания 16 битного изображения, ну или я не нашел, хотя я уже все перерыл

Добавлено через 3 минуты
murderer, Voland_, Хотя может и на js можно сделать по аналогии с тем, что накидал выше murderer, но я не настолько владею js, вот только начал его использовать
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
02.07.2021, 07:05 6
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
В заголовке темы ошибка, там должно быть "с 16 битными градациями серого",
исправил
1
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
02.07.2021, 08:15 7
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
после извлечения данных с детекторов в ОЗУ мк будет находиться массив размером MxN из 16 битных чисел
Тебе нужно добавить перед этим массивом две структуры - BITMAPFILEHEADER и BITMAPV5HEADER и получится bmp-файл. Чтобы порядок строк был правильным поле bV5Height должно содержать отрицательное значение высоты.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
02.07.2021, 08:20  [ТС] 8
murderer, кажется начинаю понимать, только вопрос: из массива данных array[0..65535]
bV5Width: 256;
bV5Height: 256;
я так понимаю потом при декодовании этого файла данные и будут разгребаться согласно этому размеру 256х256, почему тогда
Цитата Сообщение от murderer Посмотреть сообщение
bV5Height должно содержать отрицательное значение высоты.
?
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
02.07.2021, 08:30 9
Если высота будет положительной то строки будут выводиться снизу-вверх, при отрицательном значении строки выводятся сверху-вниз. Во вложении два одинаковых bmp-файла, отличается только поле bV5Height. Ещё насколько я помню размер строки должен быть кратен 4 байтам (строка просто добивается нулями до нужного размера).
Вложения
Тип файла: rar bmp.rar (899 байт, 10 просмотров)
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
02.07.2021, 10:32  [ТС] 10
murderer, инетерсно, тоже с этим сталкивался, когда выводил данные в canvas на html, начало координат левый верхний угол. Ну сейчас попробуем на stm32 это реализовать)

Добавлено через 1 час 59 минут
murderer, создал структуру
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct tagBITMAPFILEHEADER
{
  unsigned long int bfType;
  unsigned long int bfSize;
  unsigned long int bfReserved1;
  unsigned long int bfReserved2;
  unsigned long int bfOffBits;
} BITMAPFILEHEADER;
struct tagBITMAPFILEHEADER BITMAPFILEHEADER_BMP;
 
typedef struct tagBITMAPV5HEADER
{
   unsigned long int  bV5Size;
   long int bV5Width;
   long int bV5Height;
   uint16_t bV5Planes;
   uint16_t bV5BitCount;
   unsigned long int bV5Compression;
   unsigned long int bV5SizeImage;
   uint16_t bV5RedMask;
   uint16_t bV5GreenMask;
   uint16_t bV5BlueMask;
} BITMAPV5HEADER;
struct tagBITMAPV5HEADER BITMAPV5HEADER_BMP;
Создаю массив 65536 значений, зополняю их, заполняю структуру
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  uint16_t BmpArray[65536];
  for(uint16_t z = 0; z < 65536; z++)
  {
      BmpArray[z] = z;
  }
 
  BITMAPFILEHEADER_BMP.bfType = 0x4D42;
  BITMAPFILEHEADER_BMP.bfSize = sizeof(BITMAPFILEHEADER_BMP) + sizeof(BITMAPV5HEADER_BMP) + sizeof(BmpArray);
  BITMAPFILEHEADER_BMP.bfOffBits = sizeof(BITMAPFILEHEADER_BMP) + sizeof(BITMAPV5HEADER_BMP); //14 + 30
 
  BITMAPV5HEADER_BMP.bV5Size = sizeof(BITMAPV5HEADER_BMP); //30
  BITMAPV5HEADER_BMP.bV5Width = 256;
  BITMAPV5HEADER_BMP.bV5Height = 256;
  BITMAPV5HEADER_BMP.bV5Planes = 1;
  BITMAPV5HEADER_BMP.bV5BitCount = 16;
  BITMAPV5HEADER_BMP.bV5Compression = 'BI_BITFIELDS';
  BITMAPV5HEADER_BMP.bV5SizeImage = 256*256*2;
  BITMAPV5HEADER_BMP.bV5RedMask = 0xFFFF;
  BITMAPV5HEADER_BMP.bV5GreenMask = 0xFFFF;
  BITMAPV5HEADER_BMP.bV5BlueMask = 0xFFFF;
Теперь по сути мне эти две структуры поставить перед массивом данных и отправить в таком виде?
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
02.07.2021, 10:55 11
Мне кажется структуру tagBITMAPV5HEADER нужно описывать полностью, так как по значению поля bV5Size прикладное ПО определяет версию BMP. В обрезанном виде файл может не открыться.

Добавлено через 5 минут
Код
BITMAPV5HEADER_BMP.bV5Compression = 'BI_BITFIELDS';
BI_BITFIELDS- это константа, равная 3. То есть правильно так:
C
1
BITMAPV5HEADER_BMP.bV5Compression = 3;
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
02.07.2021, 11:06  [ТС] 12
murderer, ну я смотрю по той же самой википедии, например
https://ru.wikipedia.org/wiki/... 1%80%D0%B0
Структура
BITMAPFILEHEADER
и BITMAPINFO (BITMAPV5HEADER)
Ну да, верно ндо полностью заполнять, там в BITMAPV5HEADER больше параметров
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
typedef struct {
  DWORD        bV5Size;
  LONG         bV5Width;
  LONG         bV5Height;
  WORD         bV5Planes;
  WORD         bV5BitCount;
  DWORD        bV5Compression;
  DWORD        bV5SizeImage;
  LONG         bV5XPelsPerMeter;
  LONG         bV5YPelsPerMeter;
  DWORD        bV5ClrUsed;
  DWORD        bV5ClrImportant;
  DWORD        bV5RedMask;
  DWORD        bV5GreenMask;
  DWORD        bV5BlueMask;
  DWORD        bV5AlphaMask;
  DWORD        bV5CSType;
  CIEXYZTRIPLE bV5Endpoints;
  DWORD        bV5GammaRed;
  DWORD        bV5GammaGreen;
  DWORD        bV5GammaBlue;
  DWORD        bV5Intent;
  DWORD        bV5ProfileData;
  DWORD        bV5ProfileSize;
  DWORD        bV5Reserved;
} BITMAPV5HEADER, *LPBITMAPV5HEADER, *PBITMAPV5HEADER;
Проблема возникла у мк, получается массив он обрабатывает в ОЗУ, и массив в 65536 2байтных данных не помещаются в память, это порядка 128КБ, а помяти свободно 70КБ. Если создание всех этих структур перенести на Javascipt тут все тоже самое будет, кроме синтаксиса, идеяостанется такой же, просто 2 заполненные структуры поставить перед массивом данных?
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
02.07.2021, 11:28 13
просто 2 заполненные структуры поставить перед массивом данных?
Да.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
02.07.2021, 14:21  [ТС] 14
murderer, У Вас глубина цвета показытся 32, это разве не значит, что изображение RGB?

Добавлено через 1 час 26 минут
murderer, Может я ошибаюсь, но помоему у Вас изображение все-таки RGBA, про grayscale ничего не могу найти в структуре. И еще вопрос, почему BI_BITFIELDS- это константа, равная 3? Откуда берется ее значение?
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
02.07.2021, 14:56 15
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
У Вас глубина цвета показытся 32
Глубина цвета задаётся полем bV5BitCount. При этом маски каналов настроены так, что все каналы ссылаются на одно и тоже значение.

Цитата Сообщение от DmitryDDDD Посмотреть сообщение
почему BI_BITFIELDS- это константа, равная 3? Откуда берется ее значение?
Из wingdi.h.
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
02.07.2021, 15:02 16
DmitryDDDD, кстати! А я вот, что-то сильно усомнился, что есть формат BMP 16-битной глубины цветности. На сегодня 32битный цвет - это ведь 888[RGB]+канал прозрачности. И другие комбинации 565, 444, 232 - для разных видов кодирования цвета не достигают желаемой вами глубины в 16бит. Поэтому, тут впору перепроверить вообще - что и в каком виде вы собираетесь получать и как отображать.

Добавлено через 2 минуты
https://en.wikipedia.org/wiki/Grayscale
The TIFF and PNG (among other) image file formats support 16-bit greyscale natively, although browsers and many imaging programs tend to ignore the low order 8 bits of each pixel.
то есть, похоже, только эти форматы стоит брать во внимание.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
02.07.2021, 15:04  [ТС] 17
murderer, Voland_,
Цитата Сообщение от Voland_ Посмотреть сообщение
А я вот, что-то сильно усомнился, что есть формат BMP 16-битной глубины цветности
Да вообще вроде есть, я знаю точно, что есть 16 битный TIFF, BMP вроде тоже.
Там вопрос будет с сжатием еще
В данном формате можно хранить только однослойные растры. На каждый пиксель в разных файлах может приходиться разное количество бит (глубина цвета). Microsoft предлагает битности 1, 2, 4, 8, 16, 24, 32, 48 и 64. В битностях 8 и ниже цвет указывается индексом из таблицы цветов (палитры), а при бо́льших — непосредственным значением. Цвет же в любом случае можно задать только в цветовой модели RGB (как при непосредственном указании в пикселе, так и в таблице цветов), но в битностях 16 и 32 можно получить Grayscale с глубиной до 16 и 32 бит, соответственно. Частичная прозрачность реализована альфа-каналом различных битностей, но при этом прозрачность без градаций можно косвенно получить RLE-кодированием.
Для меня TIFF было бы идеально, но пока не могу побраться к тому, чтобы хоть как-то создать этот формат
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
02.07.2021, 15:05 18
Еще инфа. Так выходит, что PNG и TIFF - это популярные типы файлов. Остальные (кроме фотошопного) я и не слышал. Еще иногда фотики могут сохранять кадры в формате raw, но у меня был только 10ти битная глубина каждого оттенка цвета.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
02.07.2021, 15:09  [ТС] 19
Voland_, Raw точно нет, там формат не стандартизирован, я вообще удивлен, что такие трудности с тем, чтобы создать изображение из массива, с библиотеками тоже мало что находится подходящего
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
02.07.2021, 15:35 20
Цитата Сообщение от Voland_ Посмотреть сообщение
А я вот, что-то сильно усомнился, что есть формат BMP 16-битной глубины цветности
Это не документированная фича. В MSDN пишут
When the bV5Compression member is BI_BITFIELDS, bits set in each DWORD mask must be contiguous and should not overlap the bits of another mask.
То есть каналы не должны ссылаться на одну и туже область памяти, а у нас по сути R=G=B. Однако paint без проблем открывает 16-битный grayscale. Про такую возможность я узнал из русской википедии и тоже был удивлён, что это работает.
0
02.07.2021, 15:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2021, 15:35
Помогаю со студенческими работами здесь

Преобразование изображения к оттенкам серого
Здравствуйте! Очень нужна помощь) Пишу приложение, которое делает выделение контуров на изображении...

Сохранение изображения 16-бит оттенков серого
Получаю массив цвета пикселей. Необходимо сохранить его в .tiff На экран вывести 16 бит...

Перевод в градации серого части изображения
Доброго времени суток! Нужна помощь. Возникла проблема при выполнении вот такой работы: &quot;Создайте...

Как получить 3Д график из данных полученных из изображения в оттенках серого?
У меня такой вопрос - как получить 3Д график из данных полученных из изображения в оттенках серого,...

Функция, которая каждую четную строку изображения переводит в градации серого цвета
Разработайте функцию, которая каждую четную строку изображения переводит в градации серого цвета

Разработайте функцию, которая каждую четную строку изображения переводит в градации серого цвета
Разработайте функцию, которая каждую четную строку изображения переводит в градации серого цвета.

Создание PNG с 16 битной градацией серого
Всем добрый день, возникла потребность создавать во фронтэнде, т.е. на стороне клиента (браузера),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru