Общие сведения о языке программирования Matlab. Функции работы с векторами и матрицами. Операторы условных переходов. Построение двумерных графиков. Построение гистограммы изображения. Функции его преобразования и зашумления, метрики определения качества.
Аннотация к работе
Как видно из рисунка рабочая среда состоит из набора окон, каждое из которых имеет свое функциональное назначение [1]: - Окно команд (Command window) - предназначено для ввода команд на языке Matlab и отображения результатов их выполнения. Для вывода на экран определенного элемента вектора необходимо указать название переменной, являющейся вектором и рядом с ней в круглых скобках указать порядковый номер элемента. Рекомендуется самостоятельное ознакомление с операторами над матрицами и массивами, используя приведенную ниже таблицу. matlab оператор матрица изображение Соответственно, для нахождения суммы элементов матрицы размером M?N необходимо преобразовать всю матрицу в вектор столбец, а затем применить функцию sum.
Введение
Matlab представляет собой пакет прикладных программ, используемых для решения задач математического моделирования. На сегодняшний день данная система является стандартом де-факто в области инженерных вычислений. В состав Matlab входит мощный набор различных инструментов, предназначенных для решения таких задач, как цифровая обработка сигналов, построение искусственных нейронных сетей, моделей систем автоматического управления и т.д.
Пакет Image Processing Toollbox (IPT), также входящий в состав Matlab предназначен для решения задач цифровой обработки изображений. Цикл лабораторных работ основан на использовании именно данного программного пакета.
Целями лабораторной работы: · знакомство с рабочей средой системы Matlab;
· получение базовых знаний о языке программирования Matlab;
· обучение использованию некоторых базовых функций обработки изображения, входящих в IPT.
1. Рабочая среда Matlab
На рисунке 1 отображена рабочая среда системы Matlab.
Рисунок 1. - рабочая среда системы Matlab
Как видно из рисунка рабочая среда состоит из набора окон, каждое из которых имеет свое функциональное назначение [1]: - Окно команд (Command window) - предназначено для ввода команд на языке Matlab и отображения результатов их выполнения.
- Окно рабочего пространства (Workspace) - отображает список переменных, используемых в ходе работы алгоритма, а также некоторую дополнительную информацию по ним (тип, значение и т.д.).
- Окно совершенных команд (Command History) - отображает список вводимых ранее команд. Используя данное окно, можно осуществлять их вызов путем нажатия левой кнопкой мыши по строке с соответствующей командой.
- Окно текущей папки (Current Folder) - отображает текущую рабочую папку пользователя. В случае нахождения необходимого файла, например изображения, в текущей рабочей папке пользователь может обращаться к нему из командной строки без указания полного местоположения.
2. Язык программирования Matlab (общие сведения)
Для написания алгоритмов в системе используется одноименный язык Matlab, представляющий собой высокоуровневый интерпретируемый язык программирования. Все команды после их написания в окне команд запускаются на выполнение клавишей Enter.
В программном коде можно писать комментарии, которые не будут учитываться при выполнении программы. Комментарии пишутся после знака процентов %. Вся строка, написанная после данного знака, будет считаться комментарием. Комментарии облегчают восприятие кода программы.
Рассмотрим некоторые основные составляющие языка Matlab.
2.1 Основные классы данных
Matlab поддерживает следующие основные классы данных, перечисленные в таблице 1 [1].
Таблица 1. Основные классы данных в Matlab
В данной таблице представлены 8 числовых классов, 1 символьный класс и 1 логический класс. В дальнейшем основная работа будет вестись с матрицами и массивами, состоящими из элементов конкретного типа.
2.2 Работа с векторами
Вектор представляет собой матрицу размером 1 ? N. Для создания вектора используются квадратные скобки, в которых размещаются его элементы, отделенные друг от друга пробелом.
Примечание №1: если после выполнения приведенного выше примера посмотреть на окно рабочего пространства, то можно увидеть приведенную ниже информацию (рисунок 2).
Рисунок 2 - Окно рабочего пространства
В данном окне отображена переменная-массив со значениями, заданными в ранее написанной команде. Если дважды щелкнуть левой кнопкой мышки на имени переменной, то появится таблица, в которой можно будет вручную отредактировать любой элемент массива.
Примечание №2: если после ввода любой команды поставить символ точки с запятой “;”, то результаты выполнения команды не будут отображены. Данный прием полезен в случае, когда предполагаемый результат выполнения команды не сможет целиком поместиться на экран. Например, матрица размером 100 ? 100 не сможет поместиться полностью на экран.
Рисунок 3 - Редактор переменных
Отсчет элементов вектора начинается с единицы. Для вывода на экран определенного элемента вектора необходимо указать название переменной, являющейся вектором и рядом с ней в круглых скобках указать порядковый номер элемента.
>> a(4) ans = 9 ans представляет собой переменную, хранящую результаты последней операции в случае, если эти результаты не были присвоены какой-либо переменной пользователя.
2.2.1 Индексация векторов
Содержимое массива можно редактировать не только с использование редактора переменных, но и с использованием Matlab-кода.
Например: >> a(2) = 100 a = 7 100 3 9 5 6 1 8 4
В данном случае был выбран второй элемент массива a. С помощью знака равенства ему было присвоено значение 100.
Кроме того, в массив можно добавлять новые элементы. Рассмотрим следующий пример: >> a = [7 2 3 9 5 6 1 8 4] a = 7 2 3 9 5 6 1 8 4
>> a(10) = 100 a = 7 2 3 9 5 6 1 8 4 100
Для добавления нового элемента в круглых скобках рядом с названием массива был написан порядковый номер, который на единицу больше общего количества элементов массива.
Для вывода диапазона значений вектора используется символ точки с запятой “:”. Перед данным символом ставится начальное положение диапазона значений, а после - конечное.
Например: >> a(2:5) ans = 2 3 9 5
Если конечным элементом выборки является последний элемент вектора, то вместо его порядкового номера можно использовать ключевое слово end.
>> a(2:end) ans = 2 3 9 5 6 1 8 4
2.3 Работа с матрицами
Создание матрицы в Matlab создается с использованием квадратных скобок, в которых помещаются вектора. Вектора отделяются друг от друга символом точки с запятой “;”.
Например: >> a = [1 2 3; 4 5 6; 7 8 9] a =
1 2 3
4 5 6
7 8 9
Выбор соответствующего элемента матрицы осуществляется путем указания в круглых скобках номер строки и номер столбца.
Например: >> a = [1 2 3; 4 5 6; 7 8 9] a =
1 2 3
4 5 6
7 8 9
>> a(2,1) ans = 4
2.3.1 Индексация матриц
Получение набора элементов матрицы осуществляется аналогично получению выборки элементов вектора. В приведенном ниже примере из матрицы a выбраны все значения первой и второй строки.
Например: >>a = [1 2 3; 4 5 6; 7 8 9];
a(1:2,1:3) ans =
1 2 3
4 5 6
Кроме того, символ двоеточия “:” может быть использован для преобразования матрицы в вектор, в котором все вектора матрицы располагаются последовательно друг за другом.
Например: f = [1 2 3; 4 5 6; 7 8 9];
>> f(:) ans = 1
4
7
2
5
8
3
6
9
2.4 Базовые операторы и функции работы с векторами и матрицами
Язык Matlab поддерживает большое количество операторов работы с векторами и матрицами. Некоторые из них приведены в таблице 2 [1], где A и B - матрицы или массивы.
Перечисленные операции реализованы либо с помощью оператора, либо с помощью соответствующей функции языка Matlab.
Например: Операция сложения матриц реализуется либо с использованием знака сложения “ ”, либо с использование функции plus(A,B)
>> f = [1 2 3; 4 5 6];
z = [4 2 1; 9 4 1];
f z ans =
5 4 4
13 9 7
>> plus(f,z) ans =
5 4 4
13 9 7
Рекомендуется самостоятельное ознакомление с операторами над матрицами и массивами, используя приведенную ниже таблицу. matlab оператор матрица изображение
Таблица 2. Операции с массивами и матрицами
Помимо приведенных выше операторов приведем ряд дополнительных функций, направленных на обработку данных массива или матрицы или создание некоторых стандартных массивов [1]: · sum(A) - нахождение суммы элементов вектора-столбца. Если в качестве параметра A используется матрица, то результатом выполнения функции будет вектор-строка, элементами которого является сумма элементов каждого столбца матрицы.
Например: >> f = [1 2 3; 4 5 6; 7 8 9] sum(f) f =
1 2 3
4 5 6
7 8 9 ans = 12 15 18
Соответственно, для нахождения суммы элементов матрицы размером M?N необходимо преобразовать всю матрицу в вектор столбец, а затем применить функцию sum. Сделать это можно следующим образом: sum(A(:)), либо sum(sum(A)).
· size(A) - возвращает вектор-строку, состоящую из двух параметров: числа строк и столбцов массива, т.е. его размер. Например: >> f = [1 2 3; 4 5 6; 7 8 9]; >> size(f) ans = 3 3
· mean2(A) - вычисляет среднее значение элементов матрицы A.
· min(A) - вычисляет наименьшее значение каждого столбца матрицы. Если А - вектор, то вычисляет наименьший элемент вектора.
· max(A) - вычисляет наименьшее значение каждого столбца матрицы. Если А - вектор, то вычисляет наименьший элемент вектора.
· zeros(M, N) - генерирует матрицу размером M x N, состоящую из нулей класса double.
· ones(M, N) - генерирует матрицу размером M x N, состоящую из единиц класса double.
2.3 Ветвление программы
В данном теоретическом разделе мы рассмотрим лишь некоторые операторы условных переходов, которые будут необходимы в рамках данной лабораторной работы. Они представлены в таблице 3.
Таблица 3. Операторы условных переходов.
2.3.1 Операторы if, else и elseif
Условный оператор if имеет следующий синтаксис [1]: If выражение
Операторы end
Вначале проверяется истинность выражения. Если оно действительно истинно, то выполняются операторы вплоть до ключевого слова end.
Однако выражение не всегда бывает истинным. Поэтому в языке Matlab предусмотрены операторы, обеспечивающие дальнейшее ветвление оператора if. Синтаксис такого ветвления следующий [1]: If выражение1
Операторы 1 elseif выражение 2
Операторы 2 else Операторы 3 end
Если выражение 1 истинно, то выполняются Операторы 1, в противном случае осуществляется проверка выражения 2 на предмет истинности. В случае его истинности выполняются Операторы 2. Если и это условие не выполнимо, то выполняются Операторы 3.
Например
>> f = [8 6; 5 4]; %Объявление массива if (f(2,1) > 5) %Если элемент второй строчки первого столбца массива больше 4 f(2,1) = 100 %то присваиваем ему значение 100 elseif (f(2,1) < 5) %Иначе, если данный элемент меньше 5 f(2,1) = 1 %то присваиваем ему 1 else f = f*0 %иначе обнуляем всю матрицу end f =
0 0
0 0
Как видно из примера, в результате проверки условий матрица обнулилась, потому что выбранный элемент матрицы был равен 5, что не удовлетворяло ни первому, ни второму условию.
2.3.2 Циклы
В языке Matlab существуют два вида цикла: for и while [1].
Цикл for выполняет предписанные операции заданное число раз. Цикл for имеет следующий синтаксис [1]: for index = start : step : end операторы end где start - начальное значение переменной (index); increment - шаг увеличения или уменьшения переменной; end - конечное значение переменной, при достижении которого выполнение цикла завершается.
Циклы можно вкладывать друг в друга.
Например: for index1 = start1 : step1 : end1 операторы1 for index2 = start2 : step2 : end2 операторы2 end операторы3 end
Таким образом, один и тот же цикл можно повторять несколько раз путем помещения его в другой цикл.
Пример использования цикла for
>> a = 0;
for y = 1:1:10 a = a 1;
end
В данном примере на каждой итерации цикла переменная “a” увеличивается на 1. Цикл завершает работу после 10 итераций.
Цикл while - выполняет группу операций, пока истинно заранее заданное выражение.
Синтаксис цикла while: while выражение операторы end
Также как и циклы for, циклы while тоже могут быть вложены друг в друга по следующему правилу: while выражение1 операторы1 while выражение2 операторы2 end операторы3 end
Пример использования цикла while
>> a = 5;
x = zeros(1, 6); %Создаем пустой вектор размером 1x6 index = 1; %Создаем индекс, определяющий положение нового значения “a” в векторе while a > 0 x(index) = a;
index = index 1;
a = a - 1;
end x x = 5 4 3 2 1 0
2.4 Функции
При написании программы может потребоваться постоянное использование одного и того же фрагмента программного кода. В таком случае его лучше представить в виде функции.
В сильно упрощенном виде функция определяется по следующим правилам: function [ output_args ] = Untitled( input_args ) end где input_args - входные параметры функции, которые определяются в квадратных скобках через запятую; output_args - выходные параметры функции, определяемые в круглых скобках через запятую.
Для создания функции в меню среды Matlab необходимо выбрать File/New/Function. В открывшемся окошке осуществляется написание функции. Каждая созданная функция после сохранения в отдельный файл имеет разрешение .m, например function.m. Для выполнения функции необходимо, чтобы файл с программной реализацией данной функции находился в текущей рабочей папке пользователя.
Ниже представлен пример простейшей функции, выполняющей сложение двух чисел.
Пример функции: function [ sum ] = Summa( a, b ) sum = a b;
end
Вызов созданной функции в программе: >> Summa(10, 15) ans = 25
2.5 Построение графиков
В системе Matlab построение двумерных графиков осуществляется при помощи функции plot(A, B), где A и B - вектора параметров, график зависимости между которыми будет выведен на экран.
Пусть у нас имеется два массива параметров: a = [15 12 9 6 5 4 2 1] b = [0 1 2 3 4 5 6 7]
Построение графика зависимости a от b осуществляется по следующему образцу: >> b = [15 12 9 6 5 4 2 1] a = [0 1 2 3 4 5 6 7] figure %Команда figure создает окно для вывода графика на экран plot(a, b) %Вызов функции построения графика title("Зависимость параметра a от параметра b") %Название графика xlabel("Параметр a, усл. ед.") %Подпись оси X ylabel("Параметр b, усл. ед.") %Подпись оси Y grid on %установка сетки на график
Рисунок 4 - вывод построенного графика на экран
3. Работа с изображениями в среде Matlab
Изображение в цифровом виде представляет собой матрицу вида [1]:
где f(1,1) - яркость пикселя изображения.
В данной лабораторной работе для удобства будут рассматриваться полутоновые изображения. Полутоновые изображения представляют собой матрицы класса uint8 или uint16. Если изображение класса uint8, то его значения яркости определены на интервале [0 255], если uint16 - на интервале [0 65535]
Поскольку Matlab содержит достаточно большое количество команд для работы с изображением, будут рассмотрены лишь некоторые основные из них.
3.1 Ввод/вывод и запись изображения
Ввод изображения осуществляется при помощи функции imread f = imread(path) где f - переменная, хранящая матрицу элементов изображения, path - местоположение графического файла на компьютере.
Для вывода изображения на экран используется функция imshow(A), где A - матрица пикселей загруженного изображения.
Например
>> f = imread(‘F:/Images/boat.jpg’);
imshow(f)
Результатом выполнения последней команды будет вывод на экран окна с загруженным изображением.
Рисунок 5 - окно вывода изображения на экран
Обратите внимание, если существует необходимость вывода на экран нескольких изображений, то перед новым вызовом функции imshow необходимо писать ключевое слово figure для формирования нового окна вывода.
Например: >> f1 = imread(‘F:/Images/boat.jpg’);
imshow(f1) f2 = imread(‘F:/Images/lena.jpg’);
figure, imshow(f2)
Рисунок 6 - Вывод нескольких изображений на экран
Для сохранения изображения используется функция imwrite(f, path), где f - сохраняемое изображение, path - полное имя файла.
Например
>> f = imread(‘F:/Images/boat.jpg’);
imwrite(f, ‘F:/Images/NEWBOAT.jpg’);
Стоит отметить, что выведенное на экран изображение или график можно легко сохранить, выбрав в появившемся окне File/Save As
3.2 Построение гистограммы изображения
Вывод на экран гистограммы изображения осуществляется при помощи функции imhist, h = imhist(image, b) где h - полученная гистограмма изображения, image - изображение, b - число корзин, используемых при формировании гистограммы (по умолчанию принимает значение 256) [1].
Гистограмму изображения можно подвергнуть процедуре эквализации для улучшения качества изображения. Гистограммная эквализация - операция, заключающаяся в увеличении динамического диапазона изображения, осуществляется при помощи функции histeq. g = histeq(image, nlev). где g - эквализованная гистограмма, image - исходное изображение, nlev - число уровней интенсивности, установленное выходного изображения [1].
Например: f = imread("F:/Images/lena.jpg");
imshow(f) %Вывод исходного изображения на экран figure, imhist(f); %Вывод на экран гистограммы изображения f1 = histeq(f, 256); %Получение нового изображения с эквализованной гистограммой figure, imshow(f1) %Вывод на экран улучшенного изображения figure, imhist(f1) %Вывод на экран эквализованной гистограммы
В приведенном выше примере динамический диапазон изображения был расширен до 256. В результате эквализации гистограммы исходного изображения было улучшено его качество, что хорошо видно на рисунке 7
Рисунок 7 - Исходное изображение и его гистограмма
Рисунок 8 - Улучшенное изображение и его гистограмма
3.3 Усечение и геометрические преобразования изображений
Для усечения изображения используется операция выбора элементов массива в определенном диапазоне по высоте и ширине. Т.е. используется стандартная операция, связанная с индексацией матриц. Например: >> f = imread("F:/Images /boat.jpg");
f = f(1:end, 1:200);
imshow(f)
Рисунок 9 - Изображение до и после усечения
Для изменения размера изображения используется функция imresize, синтаксис которой: image= imresize(picture, [rows columns]) где picture - исходное изображение, [rows columns] - массив, хранящий высоту и ширину конечного изображения.
Например: >> f = imread("F:/Images /boat.jpg");
f1 = imresize(f, [256 256]);
Поворот изображения реализован функцией imrotate, имеющей следующий синтаксис: Image = imrotate(изображение, угол)
Например: >> f = imread("F:/Images /boat.jpg");
f1 = imrotate(f, 30);
imshow(f1)
Рисунок 10 - Поворот изображения на 30 градусов
3.4 Зашумление изображений
Существует несколько шумов, при помощи которых можно осуществить порчу изображения, например шум “Соль и перец”, Гауссов шум и спекл-шум.
Зашумление изображения осуществляется при помощи функции
Image = imnoise(изображение, ‘тип шума’, уровень вредоносного воздействия)
Тип шума может принимать следующие значения: · ‘salt & pepper’
· ‘gaussian’
· ‘speckle’
Например: >> f = imread("F:/M/boat.jpg");
>> f1 = imnoise(f, "salt & pepper", 0.1); %Применение к исходному изображению шума
>> imshow(f1)
Рисунок 11 - Зашумление изображения
4. Метрики определения качества изображения
На данный момент не существует абсолютно-объективной меры искажения изображения. В современных исследованиях наиболее распространенным показателем качества защищенного изображения используется пиковое отношение сигнала к шуму (PSNR), вычисляемое в децибелах (DB) и определяемое по формуле (1): , (1) где и - исходное и искаженное изображения; x, y - координаты пикселей; M и N - высота и ширина изображения. Считается, что изменения внешнего вида исходного изображения незаметны, если величина PSNR не ниже 40 DB.
Стоит отметить, что в Matlab нет встроенной функции определения PSNR.
Также большое распространение получили корреляционные показатели качества, например коэффициент корреляции Пирсона (2): , (2) где c, r - координаты пикселя изображения; A(c,r), B(c,r) - исходное и искаженное изображение; Am, Bm - среднее арифметическое пикселей исходного и искаженного изображения.
Значение коэффициента корреляции определены в диапазоне от -1 до 1. В случае полной идентичности изображений данный показатель принимает значение, равное 1.
Для вычисления корреляции Пирсона в Matlab предусмотрена функция corr2 correlation = corr2(image1, image2)
Список литературы
1. Гонсалес Р., Вудс Р., Эддинс С. Цифровая обработка изображений в среде Matlab, Москва: Техносфера, 2006. - 616с.