Условный оператор и оператор цикла

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;

В результате четко определилось небо и разметка на дорожном полотне.

Условный оператор и оператор цикла - student2.ru Условный оператор и оператор цикла - student2.ru
Рис.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’);



Условный оператор и оператор цикла - student2.ru Условный оператор и оператор цикла - student2.ru
Рис.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-файл к следующим изображениям:

Условный оператор и оператор цикла - student2.ru Условный оператор и оператор цикла - student2.ru
Im1.bmp Im2.bmp

>> umnozhenie(‘Im1.bmp’, ‘Im2.bmp’)

Условный оператор и оператор цикла - student2.ru

Рис. 5. Результат применения функции umnozhenie

к Im1.bmp и Im2.bmp

Замечание.Для выполнения операций над матрицами двух изображений применяются также следующие процедуры:

Imabsdiff - вычисление модуля разности интенсивностей двух изображений;

imadd - сложить два изображения ;

imcomplement – найти дополнительное (негативное) изображение;

imdivide - разделить одно изображение на другое;

imlincomb - вычислить линейную комбинацию изображений; imsubtract - вычесть одно изображение из другого.

Наши рекомендации