Условный оператор и оператор цикла
MATLAB имеет процедуры, позволяющие создавать переходы по условию и циклы. Условный оператор
“Если <условие>, то <действие>“
работает по следующей конструкции:
>> if условие
действие;
End;
Набрав логическое выражение, необходимо нажать клавишу «Enter», после чего MATLAB сделает переход строки. Далее следует написать оператор действия, которое осуществляется в случае выполнения условия, закончив его символом «;». При этом MATLAB снова сделает переход строки. В конце необходимо написать «end», символ «;» и нажать «Enter». При отсутствии ошибок MATLAB выполнит условный оператор “if” и в командном окне появится символ «>>».
Для организации ветвления используется форма
>> if условие1
действие 1;
else
действие 2;
end;
Циклы в MATLAB осуществляются с помощью оператора «for»:
>> for счетчик = начальное значение : конечное
действие;
end;
Пример 4.2.Создать вектор, состоящий из шести чисел геометрической прогрессии со знаменателем, равным 3, и первым членом, равным 1.
>> a(0)=1;
>> for i=1:5
a(i)=a(i-1)*3;
end;
>> a
a =
1 3 6 9 12 15
Пример 4.3. Построить цикл, проходящий по всем пикселам заданного полутонового изображения. Все пикселы, у которых интенсивность больше p=180, закрасить в черный цвет. Результаты представлены на рис. 1, 2.
>> p = 180; % параметр
>> img = imread(‘C:\path\file.jpg’);
% чтение изображения
>> grayImg = rgb2gray(img);
% перевод RGB-изображения
% в полутоновое
>> m = size(grayImg,1); % определение
% числа строк
>> n = size(grayImg,2); % определение % числа столбцов
>> for i = 1 : m % цикл по строкам
for j = 1 : n % цикл по столбцам
if grayImg(i,j) > p
grayImg(i,j) = 0; % черный
end;
end;
end;
В результате четко определилось небо и разметка на дорожном полотне.
Рис.1. Исходное изображение | Рис.2. Результат работы программы примера 4.3 |
Работа с m-файлами
MATLAB позволяет создавать собственные функции – группы команд, которые можно использовать также как стандартные. Это процедуры, которые хранятся в файлах с расширением m - *.m. Необходимо создать группу команд, выделить входные и выходные параметры, дать им имена. Функции, задаваемые в m-файлах имеют следующую структуру: заголовок функции, h1 – строка - текст справки, тело функции, комментарии.
function имя(х1, х2,…..хn) % комментарий
y1=command 1(х1,х2,….хn)
……….
yk=command 1(х1,х2,….хn)
end
Здесь х1, х2,…,хn – входные параметры; y1,…, yn– выходные, имя – идентификатор новой функции. Файл записывается в текстовом редакторе и сохраняется под именем, совпадающим с идентификатором функции, с расширением *.m. Затем функцию можно вызвать в командной строке после системного приглашения.
Замечание. Для того, чтобы пользоваться функцией, заданной m-файлом, из рабочей области MATLAB, нужно разместить его в рабочей директории (см. п.1 рис.1.-выбор директории).
Пример 4.4. Задано цветное изображение объекта на почти однородном фоне. Требуется перевести изображение в бинарный формат так, чтобы белый цвет соответствовал фону, а черный - объекту.
Создадим m-файл, который решает задачу для любого изображения. Применим следующий алгоритм. Переведем цветное изображение в полутоновый формат. Вычислим среднее значение интенсивности. Применим бинаризацию с порогом, равным этому среднему значению.
Входным параметром является имя графического файла изображения - szFileName.
Код m-файла bindiff.m:
function bindiff (szFileName)
warning off all
img = imread(szFileName);
% чтение изображения
grayImage = rgb2gray( img );
% перевод GRB
% изображения в полутоновое
lines= size(grayImage, 1);
% определение числа строк
cols=size(grayImage, 2);
% определение числа столбцов
iTotalPixels = lines*cols;
BorderCount = 30;
BorderPrior = 100;
avgcolor=uint32(0);
koef = uint32(0);
for i=1:lines%Цикл по числу строк
for j=1:cols%Цикл по числу столбцов
if ( i<BorderCount | j<BorderCount | lines-i<BorderCount | cols-j<BorderCount)
koef = BorderPrior;
else
koef = 0;
end
avgcolor=avgcolor+(koef+1)*uint32(grayImage(i,j));
iTotalPixels=iTotalPixels + koef;
end; %конец цикла по столбцам
end; %конец цикла по строкам
% вычисление среднего цвета
% изображения
avgColor=double(avgcolor)/double(iTotalPixels);
diffparam=avgColor/3;
%Вычисление порога %бинаризации
res=logical( grayImage );
%Инициализация бинарного
%изображения, в которое будет
%записан результат
for i = 1:lines %Цикл по числу строк
for j=1:cols %Цикл по числу столбцов
if(abs(double(grayImage(i,j))- double(avgColor)) < double(diffparam))
res(i,j)=1; % белый
else
res(i,j)=0; % черный
end %конец цикла по столбцам
end %конец цикла по строкам
imshow(res);% вывод преобразованного
% изображения на экран
End % конец функции
Обращение
>> bindiff(‘filename.jpg’);
Рис.3. Исходное изображение | Рис.4. Результат работы программы bindiff |
Пример m-файла. Умножение изображений
Пусть на заданном изображении необходимо проанализировать выделенную область, например, квадрат. Создадим вспомогательный графический бинарный файл необходимого размера, на котором нужная область имеет белый цвет, а игнорируемое дополнение – черный. Тогда матрица такого файла - характеристическая функция области. Умножив попиксельно эти два изображения, получим новое, в котором игнорируемые пикселы будут черного цвета.
Реализовать это действие можно с помощью следующего m-файла:
function IJ=umnozhenie(way1,way2)
warning off all
I1=imread( way1 );
J1=imread( way2 );
IJ=immultiply(I1,J1);
imshow(I1),figure,imshow(J1),figure,imshow(IJ);
end
Пример 4.5. Применить вышеприведенный m-файл к следующим изображениям:
Im1.bmp | Im2.bmp |
>> umnozhenie(‘Im1.bmp’, ‘Im2.bmp’)
Рис. 5. Результат применения функции umnozhenie
к Im1.bmp и Im2.bmp
Замечание.Для выполнения операций над матрицами двух изображений применяются также следующие процедуры:
Imabsdiff - вычисление модуля разности интенсивностей двух изображений;
imadd - сложить два изображения ;
imcomplement – найти дополнительное (негативное) изображение;
imdivide - разделить одно изображение на другое;
imlincomb - вычислить линейную комбинацию изображений; imsubtract - вычесть одно изображение из другого.