Вывод изображения на дисплей
Загрузка, вывод и сохранение изображений в MATLAB. Элементарные преобразования черно-белого изображения.
MATLAB является языком высокого уровня для выполнения технических и научных вычислений. В нем интегрированы вычисления, визуализация и программирование в удобной пользовательской среде, в которой задачи и их решения выражаются с помощью привычных математических обозначений.
Пакет Image Processing Toolbox (IPT) состоит из функций MATLAB (они называются М-функции или М-файлы), которые расширяют возможности стандартной среды MATLAB для решения задач цифровой обработки изображений.
Загрузка изображений
Для загрузки (чтения) изображений в рабочее пространство MATLAB используется функция imread со следующим синтаксисом:
imread(‘filename’).
Здесь filename – строка символов, образующих полное имя загружаемого файла изображения (включая любое расширение). Например, командная строка
>> f=imread(‘chestxray.jpg’);
Присваивает изображение формата JPEG с именем chestxray матричной переменной f. Заметим, что символ (‘) используется в качестве ограничителя символьной строки filename. Точка с запятой в конце командной строки означает инструкцию системе MATLAB не отображать вывод для данной команды. Если точка с запятой отсутствует, то MATLAB отображает результат (вывод) выполнения операций в командной строке. Символ приглашения (>>) обозначает начало командной строки, который появляется в окне команд MATLAB.
Приведем таблицу с некоторыми графическими форматами, распознаваемыми командами imread и imwrite, начиная с MATLAB 6.5.
Формат изображения | Расшифровка сокращения | Допустимые расширения |
TIFF JPEG GIF BMP PNG XWD | Tagget Image File Format Joint Photographic Experts Group Graphics Interchange Format Windows Bitmap Portable Network Graphics X Window Dump | .tif, .tiff .jpg, .jpeg .gif .bmp .png .xwd |
Если в имя файла изображения не включена информация о пути к данному файлу, то filename ищется в текущей папке. А если его там нет, то делается поиск данного файла во всех папках, пути к которым указаны в пути поиска MATLAB. Самый простой способ прочесть изображение из некоторой конкретной папки – это включить полный или относительный путь к этой папке в строке filename. Например, команда
>> f=imread(‘D:\myimage\chestxray.jpg’);
считывает изображение из папки myimage на диске D:, а команда
>> f=imread(‘.\myimage\chestxray.jpg’);
загружает изображение из подпапки myimage текущей рабочей папки. Текущая рабочая папка MATLAB отображается в строке инструментов рабочего стола и ее можно поменять вручную.
Функция size(f) возвращает размер изображения, т.е. число строк и столбцов:
>> size(f)
ans =
1024 1024
Эта функция будет особенно полезной при автоматическом определении размера изображения, которое делается операцией
>> [M,N]=size(f);
При такой записи переменной M будет присвоено число строк изображения, а переменной N – число столбцов.
Функция whos сообщает дополнительную информацию о массиве. Например, строка
>> whos f
дает следующий результат:
Name | Size | Bytes | Class |
f | 1024x1024 | uint8 array | |
Grand total is 1048576 elements using 1048576 bytes |
Запись unit8 означает один из классов данных MATLAB.
Вывод изображения на дисплей
Изображения можно вывести на дисплей компьютера с помощью функции imshow, которая имеет синтаксис:
imshow(fg,G);
где f – матрица изображения, а G – число уровней яркости, используемое при отображении этого изображения. Если аргумент G опущен, то по умолчанию принимается 256 уровней яркости. Команда
imshow(f,[low high])
означает, что все пиксели со значением не больше числа low надо показывать черными, а все пиксели со значениями не меньше числа high - белыми. Все промежуточные значения показываются с промежуточной яркостью с использованием числа уровней, принятому по умолчанию.
Запись в командной строке
imshow(f, [ ])
задает для переменной low минимальное значение массива f, а переменной high присваивает его максимальное значение.
Пример 1. Чтение и вывод изображения.
Следующая команда читает изображение bird.bmp, выдает основную информацию об этом изображении и отображает его с помощью функции imshow:
>> f=imread('D:\Document\bird.bmp');
>> whos f
Name | Size | Bytes | Class |
f | 512x512 | uint8 array | |
Grand total is 262144 elements using 262144 bytes |
>> imshow(f , [ ])
В результате выполнения этой команды появится окно, содержащее рисунок, ниспадающие меню и кнопки инструментов.
С помощью кнопок инструментов можно выполнять такие действия, как смена масштаба, сохранение и преобразование графического содержимого этого окна.
Если теперь показать другое изображение с помощью функции imshow, то MATLAB поместит его на место старого. Чтобы сохранить на рабочем столе предыдущее изображение, можно использовать команду figure. Если набрать строку
>> imshow(f), figure, imshow(g)
то будут показаны оба изображения. Если изображение имеет узкий динамический диапазон, то его можно расширить для лучшей его визуализации командой
>> imshow(g, [ ])
Сохранение изображений
Изображения записываются на диск функцией imwrite, которая имеет следующий синтаксис:
imwrite(f, ‘filename’)
При такой записи строка filename должна содержать расширение, поддерживаемое системой MATLAB (см. табл. 1). Иначе желаемый формат можно задать явно с помощью третьего аргумента функции. Например, следующая команда записывает матрицу f в изображение с форматом TIFF с именем patient:
>> imwrite(f, ‘ patient ’, ‘tif ’)
или, что эквивалентно,
>> imwrite(f, ‘ patient.tif ‘)
Если строка filename не содержит информацию о пути, то функция imwrite записывает файл в текущую рабочую папку. функция imwrite может иметь другие параметры, зависящие от выбранного формата.
Классы данных
Несмотря на то, что приходится работать с целочисленными координатами, значения самих пикселей не обязательно должны быть целыми числами. В табл. 1 перечислены разные классы данных, поддерживаемые системой MATLAB. Все численные операции в MATLAB выполняются с двойной точностью в классе данных double.
Таблица 1. Классы данных. Первые восемь классов называются числовыми, девятый — символьный класс, последний класс — логический
Имя | Описание |
double | Вещественные числа с плавающей запятой двойной точности в диапазоне, примерно, от — 10308 до 10308 (8 байт на число). |
uint8 | Целые без знака в интервале [0,255] (1 байт на число). |
uintl6 | Целые без знака в интервале [0,65535] (2 байта на число). |
uint32 | Целые без знака в интервале [0,4294967295] (4 байта на число). |
int8 | Целые со знаком в интервале [—128,127] (1 байт на число). |
intl6 | Целые со знаком в интервале [—32768, 32767] (2 байта на число). |
int32 | Целые со знаком в интервале [-2147483648, 2147483647] (4 байта). |
single | Вещественные числа с плавающей запятой обычной точности в диапазоне, примерно, от —1038 до 1038 (4 байта на число). |
char | Символы (буквы и знаки) (2 байта на символ). |
logical | Значения 0 или 1 (1 байт на элемент). |
Типы изображений
Пакет IPT поддерживает следующие типы изображений:
© полутоновые изображения (изображения с градацией серого цвета);
© двоичные изображения;
© индексированные изображения;
© цветные изображения RGB.
Большинство монохромных изображений обрабатывается операциями, которые работают с двоичными и полутоновыми изображениями, поэтому вначале наше внимание будет обращено именно на эти два типа изображений. Индексированный тип и тип изображений RGB будут обсуждаться
Полутоновое изображение — это матрица, элементы яркости которой представлены в виде числовых значений. Если элементы полутонового изображения принадлежат классу uint8 или uintl6, то они представлены целыми числами, соответственно, в интервалах [0,255] и [0,65535]. Если изображение принадлежит классу double, то его пиксели являются вещественными числами с плавающей запятой. По общему соглашению, пиксели изображений double должны лежать в интервале [0,1].
Двоичные изображения имеют в MATLAB весьма специфический смысл. Они являются логическими массивами, состоящими из 0 и 1. Поэтому массив элементов 0 и 1 других классов, например, uint8, двоичным изображением не считается. Для преобразования числовых массивов в логические служит функция logical. Если А — числовой массив, состоящий из 0 и 1, то для построения логического массива В с теми же элементами следует выполнить команду
В = logical(А) .
Если массив А имеет также другие элементы, отличные от 0 и 1, то функция logical преобразует все его ненулевые единицы в логический элемент 1, а все нулевые — в логический элемент 0. Операции сравнения и логические операторы тоже порождают логические массивы.
Чтобы проверить, является ли данный массив логическим, применяется функция islogical:
islogical(C) .
Если С — логический массив, то эта функция возвращает 1, в противном случае - 0.