создание изображения в градациях серого 16 бит

Я использую openCV в первый раз. Я использую openCV3 и XCode для его кодирования. Я хочу создать 16-битное изображение в градациях серого, но я хочу, чтобы данные, которые у меня есть, были определены таким образом, что 4000 — это значение пикселя для белого и 0 для черного. У меня есть информация об этих пикселях в массиве типа int. Как я могу создать коврик и присвоить ему значения в массиве?


person graphics_master    schedule 22.04.2015    source источник


Ответы (2)


short data[] = { 0,0,4000,4000,0,0,4000, ...};
Mat gray16 = Mat(h, w, CV_16S, data);

опять же, типы должны совпадать. для 16бит нужно CV_16S и shortarray, для 8бит CV_8U и массив uchar*, для float CV_32S и float*....

person berak    schedule 22.04.2015
comment
могу ли я сделать это, используя длинный массив int и CV_16UC1? - person graphics_master; 22.04.2015
comment
нет. вам нужно либо создать CV_32S Mat (при условии, что long int имеет 32 бита на вашей машине), либо написать цикл, в котором вы копируете каждый отдельный элемент. - person berak; 22.04.2015
comment
@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
comment
Если я создам его, используя способ, определенный бераком, как я могу масштабировать значения так, чтобы белый был 65535, а черный - 0? Как работает умножение? Я новичок во всем этом, поэтому у меня слишком много вопросов. - person graphics_master; 22.04.2015
comment
В целях отображения определение белого или полностью непрозрачного всегда будет самым большим значением в масштабе, поэтому 65535 неявно будет белым. Вот почему вы должны масштабироваться с коэффициентом, чтобы 4000 не выглядело темным. В OpenCV вы можете просто использовать оператор умножения для масштабирования изображения: m *= 65353/4000 - person sebkraemer; 22.04.2015