Я использую openCV в первый раз. Я использую openCV3 и XCode для его кодирования. Я хочу создать 16-битное изображение в градациях серого, но я хочу, чтобы данные, которые у меня есть, были определены таким образом, что 4000 — это значение пикселя для белого и 0 для черного. У меня есть информация об этих пикселях в массиве типа int. Как я могу создать коврик и присвоить ему значения в массиве?
создание изображения в градациях серого 16 бит
Ответы (2)
short data[] = { 0,0,4000,4000,0,0,4000, ...};
Mat gray16 = Mat(h, w, CV_16S, data);
опять же, типы должны совпадать. для 16бит нужно CV_16S и short
array, для 8бит CV_8U и массив uchar*, для float CV_32S и float*....
person
berak
schedule
22.04.2015
могу ли я сделать это, используя длинный массив int и CV_16UC1?
- person graphics_master; 22.04.2015
нет. вам нужно либо создать CV_32S Mat (при условии, что long int имеет 32 бита на вашей машине), либо написать цикл, в котором вы копируете каждый отдельный элемент.
- person berak; 22.04.2015
@berak Большое спасибо за объяснение типов
- person m.r226; 04.10.2020
Вы можете создать свой коврик с
cv::Mat m(rows, cols, CV_16UC1);
но, насколько мне известно, нет способа определить пользовательское значение для «белого», вам придется умножить m на std::numeric_limits::max / 4000 . Однако это необходимо только при отображении изображения.
Таблица поиска может делать то же самое (потенциально медленнее), см. cv::LUT. Однако, по-видимому, он поддерживает только 8-битные изображения.
редактировать: хорошо, я пропустил часть о присвоении существующих значений массива; см. ответ Берака. Я надеюсь, что ответ все еще полезен.
person
sebkraemer
schedule
22.04.2015
Если я создам его, используя способ, определенный бераком, как я могу масштабировать значения так, чтобы белый был 65535, а черный - 0? Как работает умножение? Я новичок во всем этом, поэтому у меня слишком много вопросов.
- person graphics_master; 22.04.2015
В целях отображения определение белого или полностью непрозрачного всегда будет самым большим значением в масштабе, поэтому 65535 неявно будет белым. Вот почему вы должны масштабироваться с коэффициентом, чтобы 4000 не выглядело темным. В OpenCV вы можете просто использовать оператор умножения для масштабирования изображения: m *= 65353/4000
- person sebkraemer; 22.04.2015