С двойной точностью (64-битные) числа с плавающей запятой являются представлением MATLAB® по умолчанию для числовых данных. Однако, чтобы уменьшить требования к памяти для работы с изображениями, можно сохранить изображения как 8-битное или 16-битное беззнаковое целое с помощью числовых классов uint8
или uint16
, соответственно. Изображение, матрица данных которого имеет класс uint8
, называется 8-битным изображением; изображение, матрица данных которого имеет класс uint16
, называется 16-битным изображением.
Функция 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
, сначала умножьтесь на 65 535:
I16 = uint16(round(I64*65535));
С другой стороны разделитесь на 65 535 после преобразования изображения интенсивности uint16
к double
:
I64 = double(I16)/65535;
Компоненты цвета 8-битного изображения RGB являются целыми числами в области значений [0, 255], а не значения с плавающей точкой в области значений [0, 1]. Пиксель, компоненты цвета которого (255,255,255), отображен как белый. Команда image
отображает изображение RGB правильно, является ли его классом double
, uint8
или uint16
:
image(RGB);
Чтобы преобразовать изображение RGB от double
до uint8
, сначала умножьтесь на 255:
RGB8 = uint8(round(RGB64*255));
С другой стороны разделитесь на 255 после преобразования изображения RGB uint8
к double
:
RGB64 = double(RGB8)/255
Чтобы преобразовать изображение RGB от double
до uint16
, сначала умножьтесь на 65 535:
RGB16 = uint16(round(RGB64*65535));
С другой стороны разделитесь на 65 535 после преобразования изображения RGB uint16
к double
:
RGB64 = double(RGB16)/65535;
Чтобы использовать следующие функции MATLAB с uint8
и данными uint16
, сначала преобразуйте данные, чтобы ввести double
:
Например, если X
является изображением uint8
, бросьте данные, чтобы ввести double
:
fft(double(X))
В этих случаях выводом всегда является double
.
Функция sum
возвращает результаты в том же типе как его входной параметр, но предоставляет возможность использовать двойную точность для вычислений.
Смотрите Арифметические операции на Целочисленных Классах для получения дополнительной информации о том, как математические функции работают с типами данных, которые не являются, удваивается.
Большая часть Обработки изображений функции Toolbox™ принимает входной параметр uint16
и uint8
. Если вы планируете сделать сложную обработку изображений на 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;
Это изображение было создано с поддержкой Научного Института Космического телескопа, управляемого Ассоциацией Университетов для Исследования в Astronomy, Inc., из контракта NAs5-26555 НАСА, и воспроизводится с разрешением от AURA/STScI. Цифровые представления изображений, произведенных AURA/STScI, доступны единожды оплачиваемый. Кредиты: J. P. Harrington и Орковский K.J. (Университет Мэриленда) и НАСА.
Вычислите монохромную яркость путем объединения значений 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 (Истинный цвет) | Изображение является m n 3 массивами значений с плавающей точкой в области значений [0, 1]. | Изображение является m n 3 массивами целых чисел в области значений [0, 255] или [0, 65535]. |