(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 после преобразования uint8
Изображение RGB к double
:
RGB64 = double(RGB8)/255
Преобразовывать изображение RGB от double
к uint16
, сначала умножьтесь на 65 535:
RGB16 = uint16(round(RGB64*65535));
С другой стороны разделитесь на 65 535 после преобразования 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;
Примечание
Это изображение было создано с поддержкой Научного Института Космического телескопа, управляемого Ассоциацией Университетов для Исследования в Astronomy, Inc., из контракта NAs5-26555 НАСА, и воспроизводится с разрешением от AURA/STScI. Цифровые представления изображений, произведенных AURA/STScI, доступны с бесплатным использованием. Кредиты: Дж.П. Харрингтон и К.Й. Орковский (Университет Мэриленда) и НАСА.
Вычислите монохромную яркость путем объединения значений 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]. |