Double-precision (64-bit) чисел с плавающей запятой являются MATLAB по умолчанию® представление для числовых данных. Однако, чтобы уменьшить требования к памяти для работы с изображениями, можно хранить изображения как 8-битные или 16-битные беззнаковые целые числа, используя числовые классы uint8
или uint16
, соответственно. Изображение, матрица данных которого имеет uint8
классов называется 8-битным изображением; изображение, матрица данных которого имеет
uint16
классов называется 16-битным изображением.
The image
функция может отображать 8- или 16-битные изображения непосредственно, не преобразуя их в двойную точность. Однако image
интерпретирует значения матрицы немного по-разному, когда матрица изображения uint8
или uint16
. Конкретная интерпретация зависит от типа изображения.
Если класс X
является uint8
или uint16
его значения смещены на 1 перед использованием в качестве индексов палитры. Значение 0 указывает на первую строку палитры, значение 1 указывает на вторую строку и так далее. image
команда автоматически подает соответствующее смещение, поэтому метод отображения тот же, X
является double
, uint8
, или uint16
:
image(X); colormap(map);
Смещение индекса палитры для uint8
и uint16
данные предназначены для поддержки стандартных форматов графических файлов, которые обычно хранят данные изображения в индексированной форме с помощью палитры с 256 входами. Смещение позволяет вам манипулировать и отображать изображения этой формы, используя более эффективную память uint8
и uint16
массивы.
Из-за смещения необходимо добавить 1, чтобы преобразовать uint8
или uint16
индексированное изображение в double
. Для примера:
X64 = double(X8) + 1; or X64 = double(X16) + 1;
И наоборот, вычесть 1 для преобразования double
индексированное изображение в uint8
или uint16
:
X8 = uint8(X64 - 1); or X16 = uint16(X64 - 1);
Область области значений double
массивы изображений обычно [0, 1], но область значений 8-битных изображений интенсивности обычно [0, 255], и область значений 16-битных изображений интенсивности обычно [0, 65535]. Используйте следующую команду, чтобы отобразить 8-битное изображение интенсивности с палитрой полутонового цвета:
imagesc(I,[0 255]); colormap(gray);
Чтобы преобразовать изображение интенсивности из double
на uint16
, сначала умножить на 65535:
I16 = uint16(round(I64*65535));
И наоборот, разделите на 65535 после преобразования uint16
изображение интенсивности в double
:
I64 = double(I16)/65535;
Цветные компоненты 8-битного изображения RGB являются целыми числами в области значений [0, 255], а не значениями с плавающей точкой в области значений [0, 1]. Пиксель, цветовые компоненты которого (255 255 255) отображаются белым цветом. The image
команда правильно отображает изображение RGB, является ли его класс double
, uint8
, или uint16
:
image(RGB);
Преобразование изображения RGB из double
на uint8
, сначала умножить на 255:
RGB8 = uint8(round(RGB64*255));
И наоборот, разделите на 255 после преобразования uint8
Изображение RGB для double
:
RGB64 = double(RGB8)/255
Преобразование изображения RGB из double
на uint16
, сначала умножить на 65535:
RGB16 = uint16(round(RGB64*65535));
И наоборот, разделите на 65535 после преобразования uint16
Изображение RGB для double
:
RGB64 = double(RGB16)/65535;
Чтобы использовать следующие функции MATLAB с uint8
и uint16
данные, сначала преобразуйте данные в тип double
:
Для примера, если X
является uint8
изображение, приведите данные к типу double
:
fft(double(X))
В этих случаях выход всегда double
.
sum
функция возвращает результаты того же типа, что и ее вход, но предоставляет опцию использовать двойную точность для вычислений.
Смотрите Арифметические операции над целыми классами для получения дополнительной информации о том, как математические функции работают с типами данных, которые не удваиваются.
Большинство функций Image Processing Toolbox™ принимают uint8
и uint16
вход. Если вы планируете сделать сложную обработку изображений на uin
t8 или uint16
данные, рассмотрите включение этого тулбокса в вычислительное окружение MATLAB.
Можно выполнить несколько других операций с uint8
и uint16
массивы, включая:
Изменение формы, переупорядочивание и конкатенирование массивов с помощью функций reshape
, cat
, permute
, и []
и '
операторы
Сохранение и загрузка uint8
и uint16
массивы в MAT-файлах с использованием save
и load
. (Помните, что, если вы загружаете или сохраняете изображение в формате графического файла, вы должны использовать команды imread
и imwrite
вместо этого.)
Определение местоположения индексов ненулевых элементов в uint8
и uint16
массивы, использующие find
. Однако возвращенный массив всегда имеет класс double
.
Реляционные операторы
Вы можете выполнить арифметические операции с целочисленными данными, что позволяет вам преобразовывать типы изображений, не преобразуя сначала числовой класс данных изображения.
Этот пример читает 8-битное изображение RGB в переменный MATLAB и преобразует его в полутоновое изображение:
rgb_img = imread('ngc6543a.jpg'); % Load the image image(rgb_img) % Display the RGB image axis image;
Примечание
Это изображение было создано при поддержке Института космических телескопов, управляемого Ассоциацией университетов по исследованиям в астрономии, Inc., из контрактных NAs5-26555 НАСА, и воспроизводится с разрешения AURA/STScI. Цифровые представления изображений AURA/STScI доступны без роялти. Кредиты: J.P. Харрингтон и К. Дж. Орковски (Мэрилендский университет), и НАСА.
Вычислите монохромную яркость путем объединения значений RGB согласно стандарту NTSC, который применяет коэффициенты, связанные с чувствительностью глаза к цветам RGB:
I = .2989*rgb_img(:,:,1)... +.5870*rgb_img(:,:,2)... +.1140*rgb_img(:,:,3);
I
является изображением интенсивности с целочисленными значениями в диапазоне от минимума до нуля:
min(I(:)) ans = 0
максимум 255:
max(I(:)) ans = 255
Для отображения изображения используйте палитру полутонового цвета с 256 значениями. Это избегает необходимости масштабирования отображения данных в цвет, которое требуется, если вы используете палитру другого размера. Используйте imagesc
функция в случаях, когда палитра не содержит одну запись для каждого значения данных.
Теперь отобразите изображение на новом рисунке с помощью серой палитры:
figure; colormap(gray(256)); image(I); axis image;
Другие палитры с областью значений цветов, которые постоянно варьируются от темного до светлого, могут производить полезные изображения. Для примера попробуйте colormap(summer(256))
для классического осциллографа. Посмотрите colormap
для дополнительных вариантов.
brighten
функция позволяет вам увеличить или уменьшить интенсивность цвета в палитре, чтобы компенсировать различия в отображении компьютера или улучшить видимость слабых или ярких областей изображения (за счет противоположного конца области значений).
В этой таблице обобщается, как элементы матрицы данных интерпретируются как пиксельные цвета, в зависимости от типа изображения и класса данных.
Тип изображения | Двойные данные | данные uint8 или uint16 |
---|---|---|
Индексируемый | Изображение является массивом m на n из целых чисел в области значений [1, p]. Палитра - это массив значений с плавающей точкой p-на-3 в области значений [0, 1]. | Изображение является массивом m на n из целых чисел в области значений [0, p -1]. Палитра - это массив значений с плавающей точкой p-на-3 в области значений [0, 1]. |
Интенсивность | Изображение является массивом m на n значений с плавающей точкой, которые линейно масштабируются, чтобы получить индексы палитры. Типичная область значений значений - [0, 1]. Палитра является массивом p на 3 значений с плавающей точкой в области значений [0, 1] и обычно является полутоновым. | Изображение является массивом m на n из целых чисел, которые линейно масштабируются, чтобы получить индексы палитры. Типичная область значений значений: [0, 255] или [0, 65535]. Палитра является массивом p на 3 значений с плавающей точкой в области значений [0, 1] и обычно является полутоновым. |
RGB (Truecolor) | Изображение является массивом m на n на 3 значений с плавающей точкой в области значений [0, 1]. | Изображение является массивом m на n на 3 целых чисел в области значений [0, 255] или [0, 65535]. |