Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_лаб_ОТТ.doc
Скачиваний:
32
Добавлен:
23.11.2019
Размер:
13.25 Mб
Скачать

Лабораторная работа № 5 цифровая обработка изображений

ЦЕЛЬ РАБОТЫ

Целью работы является изучение основ представления изображений средствами машинной графики, а также ознакомление с алгоритмами цифровой обработки графических данных.

ЗАДАНИЕ К РАБОТЕ

1. Изучить типы растровых изображений и их представления в программной среде MATLAB.

2. Произвести фильтрацию сигналов изображений с использованием функций программной среды MATLAB.

3. Произвести выделение границ между областями яркости изображений.

4. Выполнить распознавание изображений.

5. Сделать выводы по результатам работы.

ПОЯСНЕНИЯ К РАБОТЕ

Одним из наиболее перспективных применений алгоритмов цифровой обработки изображений является разработка систем компьютерного (машинного) зрения [1]. Системы компьютерного зрения, как правило, предназначены для выполнения узкоспециализированных задач. Такими задачами могут быть подсчет деталей на конвейере, чтение серийных номеров какой-либо продукции, поиск поверхностных дефектов в изделиях и т. д. [2, 3]. В настоящее время также разработаны системы анализа изображений цифровой рентгенографии и ультразвуковой диагностики [3].

Системы компьютерного зрения представляют собой совокупность аппаратных и программных компонентов. ПО, как правило, обрабатывает изображения, выполняя несколько шагов. Часто изображение сначала обрабатывается с целью уменьшения шума или конвертирования множества оттенков серого в простое сочетание черного и белого (бинаризации). После первоначальных преобразований программа определяет размеры и другие характеристики изображения, на основе которых строится его дальнейшая обработка.

В большинстве случаев действие программы направлено на решение задачи распознавания отдельных областей и границ на изображениях, которые называются объектами или образами. Образ также может быть определен как упорядоченная совокупность некоторых признаков. В качестве признака, как правило, рассматривается количественное значение какого-либо параметра. Например, признаками можно считать значение длины той или иной линии на изображении, значение угла между линией на изображении и горизонтальной осью изображения и т. д. Суть задачи распознавания образов - установить, содержит ли анализируемое изображение тот или иной образ. Если изображение содержит определенный образ, то оно обладает набором признаков, из которых этот образ состоит.

Задача распознавания образов может рассматриваться как задача классификации изображений. Т. е. изображение должно быть отнесено к одному из классов c1, c2, c3, …, cM, где M – число классов. Под классом понимается совокупность образов, обладающих некоторыми общими свойствами [4]. Например, если изображение содержит признаки образа, являющегося представителем класса c3, то это изображение относится к классу c3.

В качестве последнего шага, программа формирует некоторый логический вывод. Для формирования логического вывода программа использует результаты решения задачи распознавания образов. Если речь идет о выявлении бракованных деталей, то на основе выполненного анализа программа может пропустить или забраковать деталь в соответствии с заданными критериями [2].

Таким образом, на основе изучения отдельных частей изображения система компьютерного зрения должна формировать логические выводы с помощью имеющейся у нее базы знаний. В каждом конкретном случае для формирования логического вывода используются различные алгоритмы (на основе нечетких (fuzzy) множеств [5], нейросетевые [4, 5], с применением статистически оптимальных классификаторов [4] и др.).

Чаще всего при работе с изображениями и фотографиями системы компьютерного зрения имеют дело с двумерной графикой, которую по способу создания и представления графической информации разделяют на растровую, векторную и фрактальную графику [3].

При использовании растровой графики изображение представляется с помощью набора пикселей, имеющих различные параметры. Пиксель – это наименьший и неделимый элемент изображения, как правило, имеющий форму квадрата. Каждый пиксель имеет своё значение определённого цвета, яркости и прозрачности. Растровое изображение формируется из определенного количества пикселей. При этом каждый пиксель вносит вклад в общее изображение, задавая его форму и цвет.

Для представления изображений используются различные системы координат. Наиболее часто применяются пиксельная и пространственная системы координат. В пиксельной системе изображение представляется матрицей дискретных пикселей. Для обращения к пикселю изображения указывается номер строки и номер столбца, на пересечении которых расположен пиксель. Строки нумеруются сверху вниз, а столбцы слева направо. Верхний левый пиксель имеет координаты (1, 1) [6]. В пространственной системе координат ось x направлена слева направо, а ось y сверху вниз.

Любое изображение, созданное с помощью растровой графики, характеризуется количеством пикселей и количеством используемых цветов. Количество пикселей определяет реальный максимальный размер изображения, при котором его качество не изменяется. Чем больше количество используемых цветов, тем большее количество оттенков может принимать каждый пиксель и тем качественнее изображение.

Для хранения и обработки параметров пикселя используются коды определенной разрядности, т. е. каждому пикселю соответствует некоторое число. Изображение растровой графики представляет собой последовательность таких чисел. Программа просмотра считывает эту последовательность и ставит в соответствие каждому числу свои параметры цвета на экране монитора, формируя попиксельно всё изображение в целом. В устройствах памяти изображения хранятся в виде графических файлов. Графические файлы предназначены для хранения любой графической информации, которая может быть записана различными способами. Способы записи графической информации определяют формат файла.

Формат «JPEG» является одним из самых распространённых и популярных графических форматов файлов. При сохранении файла можно указать степень сжатия изображения, в зависимости от которой получаемое изображение будет занимать разный объём памяти, и, соответственно, иметь разное качество. Формат «BMP» поддерживает максимальную глубину цвета 48 бит, следовательно, качество хранимых изображений может быть очень высоким. Однако размер такого файла становится слишком большим, поэтому на практике этот формат используется не так часто. Формат «Tiff» используется в основном для хранения изображений с большой глубиной цвета. Как правило, это изображения, получаемые со сканера или используемые в полиграфии. Формат «Png» в последнее время вытесняет форматы «Gif» и «JPEG». Данный формат использует эффективные алгоритмы сжатия без потери качества. Растровое изображение, как правило, снабжается заголовком, в котором указано его разрешение, глубина пикселя и используемая цветовая модель.

Обычно выделяют бинарные, полутоновые, палитровые и полноцветные изображения. Каждый перечисленный тип предназначен для решения определенного круга задач. Пиксели бинарного изображения кодируются нулевыми или единичными кодами. Белый цвет обычно представляется единичными значениями, а черный – нулевыми.

В программной среде MATLAB чтение изображения из файла выполняется с помощью функции imread. Синтаксис ее вызова следующий [6, 7]:

D = imread(filename)

Здесь filename – имя файла, содержащего изображение (параметр filename является строкой). Например, вызов рассматриваемой функции может иметь следующий вид:

>> D = imread('picture.jpg')

Данная команда производит чтение бинарного, полутонового или полноцветного изображения из файла с именем «picture.jpg» в массив D.

Выделение границ между различными по яркости областями изображения – одна из часто используемых операций на этапе предварительной обработки изображений. Среда MATLAB производит выделение границ яркости изображения с помощью функции edge. Синтаксис ее вызова следующий [6]:

ed1=edge(D, method, thresh)

Здесь D – массив, содержащий исходное изображение; method – строковый параметр, определяющий используемый метод выделения яркости. Он может быть одной из следующих строк: 'sobel', 'prewitt', 'roberts', 'log', 'zerocross', 'canny'; thresh – параметр, задающий порог для определения принадлежности пикселя границе яркости [6]. Функция возвращает бинарное изображение того же размера, что и исходное. Например, вызов рассматриваемой функции может иметь следующий вид:

>> ed1=edge(D, 'canny', 0.5);

Данная команда производит выделение границ яркости полутонового изображения из массива D методом Канни [6] с порогом 0,5.

Кратко поясним задачу распознавания объектов на изображениях для данной лабораторной работы. Необходимо разработать ПО в среде MATLAB, выполняющее поочередный анализ трех различных изображений. Данное ПО последовательно анализирует изображения и в результате анализа определяет содержит ли анализируемое изображение объект того или иного класса. При этом может быть распознана различная геометрическая форма объектов. Предположим, что в данном случае требуется установить присутствует ли объект, показанный на рис. 5.1 (пассажирское судно) в составе анализируемых изображений. В данном случае класс изображений только один и он представлен объектом на рис. 5.1. Данный объект – это представитель или прототип класса. Изображение объекта после выделения яркости методом Канни представлено на рис. 5.2 (произведена инверсия цвета). При этом объект на анализируемых изображениях может быть расположен под любым углом, т. е. может иметь любое направление.

Рис. 5.1 Рис. 5.2 Рис. 5.3

Изображение на рис. 5.2 можно условно разделить на более простые элементы (примитивы). Будем считать, что контуры образа на рис. 5.2 состоят из трех примитивов: контура носа, контура борта, представляющего собой прямую линию и контура кормы (области 1, 2, 3 на рис. 5.3 соответственно).

Распознавание прямой линии шириной в 1 пиксель, проходящей под углом 0 к оси x на бинарном изображении (пример на рис. 5.4) может быть произведено с помощью шаблона (маски), представленного на рис. 5.5. При этом размеры матриц изображения и шаблона должны совпадать.

Рис. 5.4 Рис. 5.5

Если бинарное изображение представить матрицей I, а шаблон матрицей b, то для определения наличия прямой линии может быть вычислено значение

,

где функция and( ) означает выполнение операции логического «И»; h – номер строки; w – номер столбца. Например, если матрица изображения на рис. 5.4 имеет размер 40x40, то значение B будет равно 40. Значение B для прямых линий, имеющих направление близкое к 0 будет близко к 40. В то же время B будет значительно отличаться от 40, если изображение не содержит прямую линию или направление линии далеко от 0. Иными словами, для принятия решения о наличии прямой линии, проходящей под углом 0 на бинарном изображении может быть использована пороговая обработка значения B. Таким образом, значение B можно считать признаком наличия прямой линии на бинарном изображении или признаком класса на рис. 5.1.

В практических случаях размер анализируемого изображения превышает размер шаблона. Поэтому для наиболее полного анализа необходимо последовательно выделять отдельные участки изображения, размер которых соответствует размеру шаблона. Таким образом, можно сказать, что шаблон «скользит» по изображению и на каждом шаге производится вычисление значения B.

Так как объект может располагаться под любым углом, может быть введено L шаблонов b(r), r=1, 2,…, L, позволяющих распознать прямую линию под любым углом. При этом для каждого шаблона b(r) необходимо вычислить значение

.

Пример набора шаблонов b(r) для распознавания линий, имеющих направление от 0 до 180 (размер шаблона 40x40, L=10) показан на рис. 5.6.

Рис. 5.6

Нередко прямые линии разграничивают область в которой присутствуют единичные значения и область, в которой все значения являются нулевыми (пример на рис. 5.7. Для распознавания таких участков изображения также может быть использован еще один тип шаблонов, представленный на рис. 5.8. Будем обозначать его символом s. При использовании шаблона s также может быть найдено значение

.

Рис. 5.7 Рис. 5.8

Значение S для изображения на рис. 5.7 и шаблона на рис. 5.8 будет равно 0. Если единичные значения расположены по обе стороны от прямой, то вычисленное значение S будет отличаться от 0. Таким образом, значение S можно считать признаком наличия области бинарного изображения, состоящей только из нулевых значений. Для распознавания рассмотренных нулевых областей вблизи линий, проходящих под любым углом может быть использовано L шаблонов S(r), r=1, 2,…, L. Пример набора шаблонов s(r), соответствующих шаблонам b(r) на рис. 5.6 показан на рис. 5.9 (размер шаблона 40x40, L=10).

Рис. 5.9

Шаблонам на рис. 5.6 также могут быть поставлены в соответствие шаблоны контура носа n(r), (r) и контура кормы k(r), (r) (рис. 5.10 и 5.11 соответственно).

Рис. 5.10 Рис. 5.11

Для них также могут быть вычислены значения

, , , .

Таким образом, процедура распознавания объекта на рис. 5.1 в составе бинарного изображения кратко может быть описана следующим образом. Сначала производится поиск прямых линий различного направления (в соответствии с шаблонами на рис. 5.6 и 5.9). Шаблоны b(r) и s(r) перемещаются по изображению и на каждом шаге перемещения вычисляются значения B и S. Вычисленные значения анализируются и используются для принятия решения о наличии прямой линии. Затем, если линия того или иного направления была обнаружена, в ее окрестности производится поиск контуров носа и кормы того же направления. Например, если была обнаружена линия с помощью шаблона b(3), то в окрестности обнаруженной линии производится распознавание контуров носа и кормы с помощью шаблонов n(3), η(3), k(3), ξ(3). При этом вычисляются и анализируются значения N1, N2, K1, K2. И, наконец, если были обнаружены контуры носа и кормы, принимается решение о наличии объекта в составе изображения.

ХОД РАБОТЫ

1. Запустить программную среду Matlab, установить активную директорию X:\MATLAB…\work\Komplex_OTT, где X – наименование литеры диска с установленной системой Matlab. Поле для установки активной директории показано на рис. 5.12;

Рис. 5.12

2. Загрузить файл изображения в рабочее пространство среды MATLAB (наименование файла указывает преподаватель). Для этого в командном окне выполнить следующие команды (в данном примере производится загрузка файла с именем «plane2.jpg»):

>> info=imfinfo('plane2.jpg');

>> D=imread('plane2.jpg');

>> imshow(D);

Результат выполнения команд показан на рис. 5.13;

Рис. 5.13

3. Выполнить преобразование загруженного изображения из полноцветного в палитровое:

>> I, map1]=rgb2ind(D, 16);

>> figure, imshow(I, map1);

4. Выполнить преобразование палитрового изображения в полутоновое:

>> G= ind2gray(I, map1);

>> figure, imshow(G);

Результат выполнения команд показан на рис. 5.14;

Рис. 5.14

5. Наложить белый гауссов шум на полутоновое изображение:

>> X=imnoise(G, 'gaussian', 0, 0.1);

>> figure, imshow(X);

Результат выполнения команд показан на рис. 5.15;

Рис. 5.15

6. Выделить границы яркости изображения с шумом:

>> ed1=edge(X, 'canny', 0.5);

>> figure, imshow(ed1);

Результат выполнения команд показан на рис. 5.16;

Рис. 5.16

7. Произвести цифровую фильтрацию сигнала изображения:

>> W=wiener2(X,[8 8]);

>> figure, imshow(W);

Результат выполнения команд показан на рис. 5.17;

Рис. 5.17

8. Выделить границы яркости изображения после выполнения фильтрации:

>> ed2=edge(W, 'canny', 0.5);

>> figure, imshow(ed2);

Результат выполнения команд показан на рис. 5.18 (произведена инверсия цвета);

Рис. 5.18

9. Сравнить изображения, полученные в результате выполнения п.6 и п.8, сделать выводы;

10. По заданию преподавателя загрузить первый файл изображения, предназначенного для распознавания, в рабочее пространство среды MATLAB. Для этого в командном окне выполнить следующие команды (в данном примере производится загрузка файла с именем «ships_1.jpg»), выполнить преобразование загруженного изображения из полноцветного в палитровое и далее преобразование из палитрового в полутоновое:

>> info=imfinfo('ships_1.jpg');

>> D_Sh=imread('ships_1.jpg');

>> figure, imshow(D_Sh);

>> [I_Sh, map]=rgb2ind(D_Sh, 16);

>> G_Sh = ind2gray(I_Sh, map);

Результат выполнения команд показан на рис. 5.19;

Рис. 5.19

11. Выделить границы яркости изображения:

>> I_1=edge(G_Sh, 'canny', 0.3);

>> figure, imshow(I_1);

>> title('Image 1');

Результат выполнения команд показан на рис. 5.20 (произведена инверсия цвета);

Рис. 5.20

14. Загрузить файл изображения, содержащего признаки класса, в рабочее пространство среды MATLAB (наименование файла указывает преподаватель).

% Картинка 1++++++++++++++++++++++++++++++++++++++++++++++++

>> b=imread('bort3.bmp');

>> s=imread('null_3.bmp');

>> count=0;

>> w0=0; h0=0; %

>> for h=1:(info.Height-40)

for w=1:(info.Width-40)

P= I_1(h:(h+39), w:(w+39));

P1=and(P, b);

B(h,w)= sum(sum(P1));

if(B(h,w)==39)

P2=and(P, s);

if(sum(sum(P2))==0)

count=count +1;

w0(count)=w;

h0(count)=h;

%figure, imshow(I_1(h:info.Height, w:(w+39)));

end

end

end

end

>> % ==== Определяем классы===========================

>> classes=0;

>> if(count~=0)

class_num=1;

classes=zeros(1, length(h0));

classes(1)= class_num;

for h=1: length(h0)

el_count=0;

for p=h: length(h0)

if(classes(p)==0 && abs(w0(p)-w0(h))<=100 && abs(h0(p)-h0(h))<=100)

classes(p)= class_num;

el_count=el_count+1;

mass(1, class_num)=w0(p);

mass(2, class_num)= h0(p);

end

end

if(el_count~=0)

class_num=class_num+1;

end

end

end

>> % ======================================================

>> % Поиск призн. «носа» и «кормы» в окрестности мин.

>> % коорд. x «линии борта»

>> count=0;

>> find=0;

>> if(classes~=0)

n=imread('n3.bmp');

k=imread('k3.bmp');

for i=1: length(max(classes))

w_min= mass(1, i)-150; w_max= mass(1, i)+150;

h_min= mass(2, i)-150; h_max= mass(2, i)+150;

if(w_min<1)

w_min=1;

end

if(w_max >(info.Width-40))

w_max=info.Width-40;

end

if(h_min<1)

h_min=1;

end

if(h_max>(info.Height-40))

h_max=info.Height-40;

end

for h= h_min:h_max

for w= w_min:w_max

P= I_1(h:(h+39), w:(w+39));

P1=and(P, n);

P11=and(P, k);

N1(h,w)= sum(sum(P1));

K1(h,w)= sum(sum(P11));

if(N1(h,w)>=67 || K1(h,w)>=65)

%figure, imshow(I_1(h:info.Height, w:(w+39)));

count=count +1;

find(1, count)=w;

find(2, count)=h;

end

end

end

end

end

>> if(find~=0)

min_x= min(find(1, :)); max_x= max(find(1, :));

min_y= min(find(2, :)); max_y= max(find(2, :));

figure, imshow(I_1(min_y:max_y+40, min_x:max_x+40));

else

disp('Объект не найден')

end

>> b=imread('bort5.bmp');

>> s=imread('null_5.bmp');

>> count=0;

>> w0=0; h0=0; %

>> for h=1:(info.Height-40)

for w=1:(info.Width-40)

P= I_1(h:(h+39), w:(w+39));

P1=and(P, b);

B(h,w)= sum(sum(P1));

if(B(h,w)>=35)

P2=and(P, s);

if(sum(sum(P2))==0)

count=count +1;

w0(count)=w;

h0(count)=h;

%figure, imshow(I_1(h:info.Height, w:(w+39)));

end

end

end

end

>> % ==== Определяем классы========================

>> classes=0;

>> if(count~=0)

class_num=1;

classes=zeros(1, length(h0));

classes(1)= class_num;

for h=1: length(h0)

el_count=0;

for p=h:length(h0)

if (classes(p)==0 && abs(w0(p)-w0(h))<=100 && abs(h0(p)-h0(h))<=100)

classes(p)= class_num;

el_count=el_count+1;

mass(1, class_num)=w0(p);

mass(2, class_num)=h0(p);

end

end

if(el_count ~=0)

class_num=class_num+1;

end

end

end

>> % Поиск призн. «носа» и «кормы» в окрестности найденных >> % «линий борта»

>> count=0;

>> find=0;

>> if(classes~=0)

n=imread('n5.bmp');

k=imread('k5.bmp');

for i=1: length(max(classes))

w_min= mass(1, i)-150; w_max= mass(1, i)+150;

h_min= mass(2, i)-150; h_max= mass(2, i)+150;

if(w_min<1)

w_min=1;

end

if(w_max >(info.Width-40))

w_max=info.Width-40;

end

if(h_min<1)

h_min=1;

end

if(h_max>(info.Height-40))

h_max=info.Height-40;

end

for h= h_min:h_max

for w= w_min:w_max

P= I_1(h:(h+39), w:(w+39));

P1=and(P, n);

P11=and(P, k);

N1(h,w)= sum(sum(P1));

K1(h,w)= sum(sum(P11));

if (N1(h,w)>=67 || K1(h,w)>=62)

%figure, imshow(I_1(h:info.Height, w:(w+39)));

count=count +1;

find(1, count)=w;

find(2, count)=h;

end

end

end

end

end

>> if(find~=0)

min_x= min(find(1, :)); max_x= max(find(1, :));

min_y= min(find(2, :)); max_y= max(find(2, :));

figure, imshow(I_1(min_y:max_y+40, min_x:max_x+40));

else

disp('Объект не найден')

end

10. Загрузить первый файл изображения, предназначенного для распознавания, в рабочее пространство среды MATLAB. Для этого в командном окне выполнить следующие команды (в данном примере производится загрузка файла с именем «ships_2.jpg»), выполнить преобразование загруженного изображения из полноцветного в палитровое и далее преобразование из палитрового в полутоновое:

>> info=imfinfo('ships_2.jpg');

>> D_Sh_2=imread('ships_2.jpg');

>> figure, imshow(D_Sh_2);

>> [I_Sh_2, map2]=rgb2ind(D_Sh_2, 16);

>> G_Sh_2 = ind2gray(I_Sh_2, map2);

Результат выполнения команд показан на рис. 5.21;

Рис. 5.21

11. Выделить границы яркости изображения:

>> I_2=edge(G_Sh_2, 'canny', 0.3);

>> figure, imshow(I_2);

Результат выполнения команд показан на рис. 5.22(произведена инверсия цвета);

Рис. 5.22

>> b=imread('bort3.bmp');

>> s=imread('null_3.bmp');

>> count=0;

>> w0=0; h0=0; %

>> for h=1:(info.Height-40)

for w=1:(info.Width-40)

P= I_2(h:(h+39), w:(w+39));

P1=and(P, b);

B(h,w)= sum(sum(P1));

if(B(h,w)==39)

P2=and(P, s);

if(sum(sum(P2))==0)

count=count +1;

w0(count)=w;

h0(count)=h;

%figure, imshow(I_2(h:info.Height, w:(w+39)));

end

end

end

end

>> % ==== Определяем классы===========================

>> classes=0;

>> if(count~=0)

class_num=1;

classes=zeros(1, length(h0));

classes(1)= class_num;

for h=1: length(h0)

el_count=0;

for p=h: length(h0)

if(classes(p)==0 && abs(w0(p)-w0(h))<=100 && abs(h0(p)-h0(h))<=100)

classes(p)= class_num;

el_count=el_count+1;

mass(1, class_num)=w0(p);

mass(2, class_num)=h0(p);

end

end

if(el_count~=0)

class_num=class_num+1;

end

end

end

>> % ===================================================

>> % Поиск призн. «носа» и «кормы» в окрестности мин.

>> % коорд. x «линии борта»

>> count=0;

>> find=0;

>> if(classes~=0)

n=imread('n3.bmp');

k=imread('k3.bmp');

for i=1:length(max(classes))

w_min= mass(1, i)-150; w_max= mass(1, i)+150;

h_min= mass(2, i)-150; h_max= mass(2, i)+150;

if(w_min<1)

w_min=1;

end

if(w_max>(info.Width-40))

w_max=info.Width-40;

end

if(h_min<1)

h_min=1;

end

if(h_max>(info.Height-40))

h_max=info.Height-40;

end

for h= h_min:h_max

for w= w_min:w_max

P= I_2(h:(h+39), w:(w+39));

P1=and(P, n);

P11=and(P, k);

N1(h,w)= sum(sum(P1));

K1(h,w)= sum(sum(P11));

if(N1(h,w)>=67 || K1(h,w)>=65)

%figure, imshow(I_2(h:info.Height, w:(w+39)));

count=count +1;

find(1, count)=w;

find(2, count)=h;

end

end

end

end

end

>> if(find~=0)

min_x= min(find(1, :)); max_x= max(find(1, :));

min_y= min(find(2, :)); max_y= max(find(2, :));

figure, imshow(I_2(min_y:max_y+40, min_x:max_x+40));

else

disp('Объект не найден')

end

>> b=imread('bort5.bmp');

>> s=imread('null_5.bmp');

>> count=0;

>> w0=0; h0=0; %

>> for h=1:(info.Height-40)

for w=1:(info.Width-40)

P= I_2(h:(h+39), w:(w+39));

P1=and(P, b);

B(h,w)= sum(sum(P1));

if(B(h,w)>=35)

P2=and(P, s);

if(sum(sum(P2))==0)

count=count +1;

w0(count)=w;

h0(count)=h;

%figure, imshow(I_2(h:info.Height, w:(w+39)));

end

end

end

end

>> % ==== Определяем классы==========================

>> classes=0;

>> if(count~=0)

class_num=1;

classes=zeros(1, length(h0));

classes(1)= class_num;

for h=1:length(h0)

el_count=0;

for p=h: length(h0)

if(classes(p)==0 && abs(w0(p)-w0(h))<=100 && abs(h0(p)-h0(h))<=100)

classes(p)= class_num;

el_count=el_count+1;

mass(1, class_num)=w0(p);

mass(2, class_num)=h0(p);

end

end

if(el_count~=0)

class_num=class_num+1;

end

end

end

>> % Поиск призн. «носа» и «кормы» в окрестности найденных

>> % «линий борта»

>> count=0;

>> find=0;

>> if(classes~=0)

n=imread('n5.bmp');

k=imread('k5.bmp');

for i=1:length(max(classes))

w_min= mass(1, i)-150; w_max= mass(1, i)+150;

h_min= mass(2, i)-150; h_max= mass(2, i)+150;

if(w_min<1)

w_min=1;

end

if(w_max >(info.Width-40))

w_max=info.Width-40;

end

if(h_min<1)

h_min=1;

end

if(h_max>(info.Height-40))

h_max=info.Height-40;

end

for h=h_min:h_max

for w= w_min:w_max

P= I_2(h:(h+39), w:(w+39));

P1=and(P, n);

P11=and(P, k);

N1(h,w)= sum(sum(P1));

K1(h,w)= sum(sum(P11));

if(N1(h,w)>=67 || K1(h,w)>=62)

%figure, imshow(I_2(h:info.Height, w:(w+39)));

count=count +1;

find(1, count)=w;

find(2, count)=h;

end

end

end

end

end

>> if(find~=0)

min_x= min(find(1, :)); max_x= max(find(1, :));

min_y= min(find(2, :)); max_y= max(find(2, :));

figure, imshow(I_2(min_y:max_y+40, min_x:max_x+40));

else

disp('Объект не найден')

end

10. Загрузить первый файл изображения, предназначенного для распознавания, в рабочее пространство среды MATLAB. Для этого в командном окне выполнить следующие команды (в данном примере производится загрузка файла с именем «ships_2.jpg»), выполнить преобразование загруженного изображения из полноцветного в палитровое и далее преобразование из палитрового в полутоновое:

>> info=imfinfo('ships_3.jpg');

>> D_Sh_3=imread('ships_3.jpg');

>> figure, imshow(D_Sh_3);

>> [I_Sh_3, map3]=rgb2ind(D_Sh_3, 16);

>> G_Sh_3 = ind2gray(I_Sh_3, map3);

Результат выполнения команд показан на рис. 5.23;

Рис. 5.23

11. Выделить границы яркости изображения:

>> I_3=edge(G_Sh_3, 'canny', 0.3);

>> figure, imshow(I_3);

Результат выполнения команд показан на рис. 5.24 (произведена инверсия цвета);

Рис. 5.24

>> b=imread('bort3.bmp');

>> s=imread('null_3.bmp');

>> count=0;

>> w0=0; h0=0; %

>> for h=1:(info.Height-40)

for w=1:(info.Width-40)

P=I_3(h:(h+39), w:(w+39));

P1=and(P, b);

B(h,w)= sum(sum(P1));

if(B(h,w)==39)

P2=and(P, s);

if(sum(sum(P2))==0)

count=count +1;

w0(count)=w;

h0(count)=h;

%figure, imshow(I_3(h:info.Height, w:(w+39)));

end

end

end

end

>> % ==== Определяем классы============================

>> classes=0;

>> if(count~=0)

class_num=1;

classes=zeros(1, length(h0));

classes(1)= class_num;

for h=1: length(h0)

el_count=0;

for p=h: length(h0)

if(classes(p)==0 && abs(w0(p)-w0(h))<=100 && abs(h0(p)-h0(h))<=100)

classes(p)= class_num;

el_count=el_count+1;

mass(1, class_num)=w0(p);

mass(2, class_num)=h0(p);

end

end

if(el_count~=0)

class_num=class_num+1;

end

end

end

>> % ===================================================

>> % Поиск призн. «носа» и «кормы» в окрестности мин.

>> % коорд. x «линии борта»

>> count=0;

>> find=0;

>> if(classes~=0)

n=imread('n3.bmp');

k=imread('k3.bmp');

for i=1: length(max(classes))

w_min= mass(1, i)-150; w_max= mass(1, i)+150;

h_min= mass(2, i)-150; h_max= mass(2, i)+150;

if(w_min<1)

w_min=1;

end

if(w_max >(info.Width-40))

w_max=info.Width-40;

end

if(h_min<1)

h_min=1;

end

if(h_max>(info.Height-40))

h_max=info.Height-40;

end

for h= h_min:h_max

for w= w_min:w_max

P= I_3(h:(h+39), w:(w+39));

P1=and(P, n);

P11=and(P, k);

N1(h,w)= sum(sum(P1));

K1(h,w)= sum(sum(P11));

if(N1(h,w)>=67 || K1(h,w)>=65)

%figure, imshow(I_3(h:info.Height, w:(w+39)));

count=count +1;

find(1, count)=w;

find(2, count)=h;

end

end

end

end

end

>> % ===================================================

>> if(find~=0)

min_x= min(find(1, :)); max_x= max(find(1, :));

min_y= min(find(2, :)); max_y= max(find(2, :));

figure, imshow(I_3(min_y:max_y+40, min_x:max_x+40));

else

disp('Объект не найден')

end

>> b=imread('bort5.bmp');

>> s=imread('null_5.bmp');

>> count=0;

>> w0=0; h0=0; %

>> for h=1:(info.Height-40)

for w=1:(info.Width-40)

P= I_3(h:(h+39), w:(w+39));

P1=and(P, b);

B(h,w)= sum(sum(P1));

if(B (h,w)>=35)

P2=and(P, s);

if(sum(sum(P2))==0)

count=count +1;

w0(count)=w;

h0(count)=h;

figure, imshow(I_3(h:info.Height, w:(w+39)));

end

end

end

end

>> % ==== Определяем классы=========================

>> classes=0;

>> if(count~=0)

class_num=1;

classes=zeros(1, length(h0));

classes(1)= class_num;

for h=1:length(h0)

el_count=0;

for p=h: length(h0)

if(classes(p)==0 && abs(w0(p)-w0(h))<=100 && abs(h0(p)-h0(h))<=100)

classes(p)= class_num;

el_count=el_count+1;

mass(1, class_num)=w0(p);

mass(2, class_num) = h0(p);

end

end

if(el_count~=0)

class_num=class_num+1;

end

end

end

>> % Поиск призн. «носа» и «кормы» в окрестности найденных

>> % «линий борта»

>> count=0;

>> find=0;

>> if(classes~=0)

n=imread('n5.bmp');

k=imread('k5.bmp');

for i=1: length(max(classes))

w_min= mass(1, i)-150; w_max= mass(1, i)+150;

h_min= mass(2, i)-150; h_max= mass(2, i)+150;

if(w_min<1)

w_min=1;

end

if(w_max >(info.Width-40))

w_max=info.Width-40;

end

if(h_min<1)

h_min=1;

end

if(h_max>(info.Height-40))

h_max=info.Height-40;

end

for h= h_min:h_max

for w= w_min:w_max

P= I_3(h:(h+39), w:(w+39));

P1=and(P, n);

P11=and(P, k);

N1(h,w)= sum(sum(P1));

K1(h,w)= sum(sum(P11));

if(N1(h,w)>=67 || K1(h,w)>=62)

%figure, imshow(I_3(h:info.Height, w:(w+39)));

count=count +1;

find(1, count)=w;

find(2, count)=h;

end

end

end

end

end

>> % ================================================

>> if(find~=0)

min_x= min(find(1, :)); max_x= max(find(1, :));

min_y= min(find(2, :)); max_y= max(find(2, :));

figure, imshow(I_3(min_y:max_y+40, min_x:max_x+40));

else

disp('Объект не найден')

end

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Перечислите и охарактеризуйте основные форматы изображений, поддерживаемых программной средой MATLAB.

2. Перечислите и охарактеризуйте типы растровых изображений.

3. Каким образом производится преобразование типов растровых изображений в программной среде MATLAB?

4. Какие функции производят фильтрацию сигналов изображений в программной среде MATLAB?

5. Какие функции производят выделение границ яркости изображений в программной среде MATLAB?

6. Какие функции программной среды MATLAB могут быть использованы для решения задачи распознавания изображений?

7. Что такое системы компьютерного зрения? Какие задачи они решают?

ЛИТЕРАТУРА

  1. Яне Б. Цифровая обработка изображений – М.: Техносфера, 2007. – 584 с.

  2. http://www.mallenom.ru/article006.php (электронный ресурс)

  3. http://www.kit-e.ru/articles/sensor/2007_1_66.php (электронный ресурс)

  4. Гонсалес Р., Вудс Р. Эддинс С. Цифровая обработка изображений в среде MATLAB. – М.: Техносфера, 2006, – 616 с.

  5. Осовский С. Нейронные сети для обработки информации. – М.: Высш. шк., 2002. – 440 с.

  6. Рудаков П. И., Сафонов В. И. Обработка сигналов и изображений в MATLAB 5.x. – М.: Диалог-МИФИ, 2000, – 416 с.

  7. Дьяконов В. П. MATLAB. Обработка сигналов и изображений. Специальный справочник. – Спб.: Питер, 2002. – 608 с.

8. Лазарев Ю. Ф. MatLAB 5.x. – Kиев: Изд. группа BHV, 2000. – 384 с.