Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Краткий курс теории обработки изображений.doc
Скачиваний:
30
Добавлен:
01.07.2025
Размер:
8 Мб
Скачать
☆

Шаг 4: Отображение результатов классификации по ближайшей окрестности.

Матрица меток содержит цветные метки для каждого пикселя на изображении. Матрица меток используется для разделения объектов на исходном изображении по цветах.

rgb_label=repmat(label, [1 1 3]);

segmented_images=repmat(uint8(0), [size(fabric), nColors]);

for count=1:nColors

color=fabric;

color(rgb_label~=color_labels(count))=0;

segmented_images(:, :, :, count)=color;

end

imshow(segmented_images(:, :, :, 2)), title('Красные объекты');

imshow(segmented_images(:, :, :, 3)), title('Зеленые объекты');

imshow(segmented_images(:, :, :, 4)), title('Фиолетовые объекты');

imshow(segmented_images(:, :, :, 5)), title('Красно-фиолетовые объекты');

imshow(segmented_images(:, :, :, 6)), title('Желтые объекты');

Шаг 5: Отображение значений 'a*' и 'b*' отмеченных цветов.

Покажем, как производится разделение различных групп цветов на основе классификации по принципу ближайшей окрестности и их отображение в системе 'a*' и 'b*'.

purple=[119/255 73/255 152/255];

plot_labels={'k', 'r', 'g', purple, 'm', 'y'};

figure

for count=1:nColors

plot(a(label==count-1),b(label==count-1),'.','MarkerEdgeColor', ...

plot_labels{count}, 'MarkerFaceColor', plot_labels{count});

hold on;

end

title('Размещение сегментированных пикселей в пространстве ''a*b*'' ');

xlabel('''a*'' values');

ylabel('''b*'' values');

Обнаружение вращений и масштабных искажений на изображении

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

Содержание:

 Шаг 1: Считывание изображения.

 Шаг 2: Изменение размеров изображения.

 Шаг 3: Вращение изображения.

 Шаг 4: Выбор контрольных точек.

 Шаг 5: Предварительные преобразования.

 Шаг 6: Определение масштаба и угла.

 Шаг 7: Восстановление изображения.

Шаг 1: Считывание изображения.

Считаем изображение в рабочее пространство.

I=imread('cameraman.tif');

imshow(I)

Шаг 2: Изменение размеров изображения.

scale=0.6;

J=imresize(I, scale); % Изменение масштаба.

Шаг 3: Вращение изображения.

theta=30;

K=imrotate(J, theta); % Изменение угла.

figure, imshow(K)

Шаг 4: Выбор контрольных точек.

Выберем контрольные точки с помощью Control Point Selection Tool.

input_points=[129.87 141.25; 112.63 67.75];

base_points=[135.26 200.15; 170.30 79.30];

cpselect(K,I, input_points, base_points);

Запишем контрольные точки, выбирая в меню File опцию Save Points to Workspace.

Также перезапишем переменные input_points и base_points.

Шаг 5: Предварительные преобразования.

Найдем структуру TFORM, которая согласуется с контрольными точками.

t=cp2tform(input_points, base_points, 'linear conformal');

После выполнения шагов 6 и 7, снова повторяются шаги 5-7,

только взамен опции 'linear conformal' используется 'affine'.

Это приводит к улучшению результатов.

Шаг 6: Определение масштаба и угла.

Структура TFORM содержит матрицу преобразований t.tdata.Tinv.

После того как стали известны типы искажений (вращение и масштабирование),

проводят операции по восстановлению масштаба и угла.

Let sc=s*cos(theta)

Let ss=s*sin(theta)

Тогда, Tinv=t.tdata.Tinv=[sc -ss 0;

ss sc 0;

tx ty 1]

где параметры tx и ty являются сдвигом по x и y соответственно.

ss=t.tdata.Tinv(2, 1);

sc=t.tdata.Tinv(1, 1);

scale_recovered=sqrt(ss*ss+sc*sc)

theta_recovered=atan2(ss, sc)*180/pi

scale_recovered=

0.6000

theta_recovered=

29.3699

Итак, значение параметра scale_recovered находится в пределах 0.6, а значение параметра theta_recovered около 30.

Шаг 7: Восстановление изображения.

Для получения исходного изображения необходимо произвести обратные преобразования с использованием структуры TFORM. Также нужно знать размер исходного изображения.

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

D=size(I);

recovered=imtransform(K, t, 'XData', [1 D(2)], 'YData', [1 D(1)]);

% Сравнение восстановленного изображения и исходного.

figure, imshow(I)

title('исходное изображение')

figure, imshow(recovered)

title('восстановленное изображение')

Регистрация изображений с помощью нормированной кросс-корреляции

Иногда одни изображения являются подмножествами других. С помощью методов нормированной кросс-корреляции существует возможность определения их расположения и регистрации.

Ключевая концепция

Нормированная кросс-корреляция, прозрачность

Ключевые функции

normxcorr2, max, ind2sub

Обзор примеров

Приведенные примеры включают следующие шаги:

 Шаг 1: Считывание изображения.

 Шаг 2: Выбор подобласти для каждого изображения.

 Шаг 3: Нормированная кросс-корреляция и поиск координат пиков.

 Шаг 4: Поиск общих относительных различий между изображениями.

 Шаг 5: Анализ подизображения, полученного из основного изображения.

 Шаг 6: Отображение вырезанного изображения на пустом изображении с размерами исходного.

 Шаг 7: Свойство прозрачности исходного изображения.

Шаг 1: Считывание изображения.

onion=imread('onion.png');

peppers=imread('peppers.png');

imshow(onion)

figure, imshow(peppers)

Шаг 2: Выбор подобласти для каждого изображения

Важной является процедура выбора похожей подобласти. Изображение sub_onion является тем эталоном, на основании которого производится поиск sub_peppers. Методы выбора этой подобласти делятся на итеративные и неитеративные.

% неитеративный

rect_onion=[111 33 65 58];

rect_peppers=[163 47 143 151];

sub_onion=imcrop(onion,rect_onion);

sub_peppers=imcrop(peppers,rect_peppers);

% или

% итеративный

[sub_onion,rect_onion]=imcrop(onion);

[sub_peppers,rect_peppers]=imcrop(peppers);

% отображение подизображений

figure, imshow(sub_onion)

figure, imshow(sub_peppers)

Шаг 3: Нормированная кросс-корреляция и поиск координат пиков

Вычисление нормированной кросс-корреляции и отображение ее поверхности. Пики матрицы кросс-корреляции, которые попали на подизображение (sub_images) свидетельствуют о наивысшей корреляции. Функция normxcorr2 работает только с полутоновыми изображениями, однако попробуем применить ее для обработки подизображений.

c=normxcorr2(sub_onion(:, :, 1), sub_peppers(:, :, 1)); figure, surf(c), shading flat

Шаг 4: Поиск общих относительных различий между изображениями Общие различия между изображениями характеризуются положением пиков в матрице кросс-корреляции, а также размерами и местонахождением подизображений.

% поиск на основании корреляции

[max_c, imax]=max(abs(c(:)));

[ypeak, xpeak]=ind2sub(size(c), imax(1));

corr_offset=[(xpeak-size(sub_onion, 2))

(ypeak-size(sub_onion, 1))];

% относительное месторасположение подизображений

rect_offset=[(rect_peppers(1)-rect_onion(1))

(rect_peppers(2)-rect_onion(2))];

% поиск на основании общих относительных различий

offset=corr_offset+rect_offset;

xoffset=offset(1);

yoffset=offset(2);

Шаг 5: Анализ подизображения, полученного из основного изображения

Подизображение на исходном изображении.

xbegin=xoffset+1;

xend=xoffset+size(onion, 2);

ybegin=yoffset+1;

yend=yoffset+size(onion, 1);

% Получение рассматриваемого подизображения и сравнение его с исходным

extracted_onion=peppers(ybegin:yend, xbegin:xend, :);

if isequal(onion, extracted_onion)

disp('onion.png получено из peppers.png')

end

Шаг 6: Отображение подизображения на пустом изображении с размерами исходного

Расположим подизображение на исходном изображении на основании анализа различий.

recovered_onion=uint8(zeros(size(peppers)));

recovered_onion(ybegin:yend, xbegin:xend, :)=onion;

figure, imshow(recovered_onion)

Шаг 7: Свойство прозрачности исходного изображения

Создание прозрачной (или полупрозрачной) маски для непрозрачного исходного изображения.

[m, n, p]=size(peppers);

mask=ones(m, n);

i=find(recovered_onion(:, :, 1)==0);

mask(i)=.2; % экспериментирование с различными значениями прозрачности

% наложение полупрозрачного рисунка

figure, imshow(peppers(:,:,1)) % отображение только красной составляющей

hold on

h=imshow(recovered_onion); % отображение recovered_onion

set(h, 'AlphaData', mask)

Наложение двух изображений

Приведем пример наложения последовательности нескольких изображений. Результат представляет собой наложение двух изображений, одно из которых представляет собой стационарный маятник, а другое - движущийся маятник.

Содержание:

 Шаг 1: Захват фонового изображения.

 Шаг 2: Обработка регистрируемых данных.

Шаг 1: Захват фонового изображения.

Произведем захват снимка и принимаем его в качестве фонового.

vidobj=videoinput('winvideo', 1, 'RGB24_320X240');

preview(vidobj)

pause(1)

background=getsnapshot(vidobj);

imshow(background);

Шаг 2: Обработка регистрируемых данных.

Полученные данные используем для обработки и отображения изображений в реальном масштабе

времени. Обработка заключается в вычислении линейной комбинации между изображениями.

pause(2);

set(gcf, 'DoubleBuffer', 'on');

vidobj.FramesPerTrigger=20;

start(vidobj)

% Вычисление линейной комбинации между текущим и фоновым изображениями.

current=getdata(vidobj, 1);

transparent=imlincomb(0.5, current, 0.5, background);

% Отображение обработанного изображения.

imshow(transparent);

% Повторение для всех изображений.

while (vidobj.FramesAvailable>0),

% Вычисление линейной комбинации между текущим и фоновым изображениями.

current=getdata(vidobj, 1);

transparent=imlincomb(0.5, current, 0.5, background);

% Отображение обработанного изображения.

imshow(transparent);

end

% Очистка рабочего пространства.

delete(vidobj)

clear vidobj

Технология повышения контрастности изображений

Пакет Image Processing Toolbox содержит несколько классических функций улучшения изображений. Эти функции являются очень эффективными при повышении контраста: imadjust, histeq, и adapthisteq. Приведем их сравнительный анализ при использовании для улучшения полутоновых и цветных изображений.

План последовательности действий

  • Шаг 1: Считывание изображения.

  • Шаг 2: Изменение размеров изображения.

  • Шаг 3: Улучшение полутонового изображения.

  • Шаг 4: Улучшение цветных изображений.

Шаг 1: Считывание изображений.

Считаем два полутоновых изображения: pout.tif и tire.tif. Также считаем индексное RGB-изображение: shadow.tif.

pout=imread('pout.tif');

tire=imread('tire.tif');

[X map]=imread('shadow.tif');

shadow=ind2rgb(X,map);

Шаг 2: Изменение размеров изображения.

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

width=210;

images={pout, tire, shadow};

for k=1:3

dim=size(images{k});

images{k}=imresize(images{k}, [width*dim(1)/dim(2) width], 'bicubic');

end

pout=images{1};

tire=images{2};

shadow=images{3};

Шаг 3: Улучшение полутоновых изображений.

Проведем сравнительный анализ эффективности использования следующих функций к улучшению изображений:

imadjust - увеличение контраста изображений путем изменения диапазона интенсивностей исходного изображения.

histeq - выполнение операции эквализации (выравнивания) гистограммы. В этом подходе увеличение контрастности изображения происходит путем преобразования гистограммы распределения значений интенсивностей элементов исходного изображения. Существуют также другие подходы к видоизменению гистограмм.

adapthisteq - выполнение контрастно-ограниченного адаптивного выравнивания гистограммы. Здесь методика повышения контрастности изображений базируется на анализе и эквализации гистограмм локальных окрестностей изображения.

pout_imadjust=imadjust(pout);

pout_histeq=histeq(pout);

pout_adapthisteq=adapthisteq(pout);

imshow(pout);

title('Original');

figure, imshow(pout_imadjust);

title('Imadjust');

figure, imshow(pout_histeq);

title('Histeq');

figure, imshow(pout_adapthisteq);

title('Adapthisteq');

tire_imadjust=imadjust(tire);

tire_histeq=histeq(tire);

tire_adapthisteq=adapthisteq(tire);

figure, imshow(tire);

title('Original');

figure, imshow(tire_imadjust);

title('Imadjust');

figure, imshow(tire_histeq);

title('Histeq');

figure, imshow(tire_adapthisteq);

title('Adapthisteq');

Проведем краткий анализ эффективности обработки изображений с помощью функций imadjust, histeq и adapthisteq. В основе этих функций лежат разные методы: в imadjust - преобразование диапазона яркостей элементов изображения, в histeq - эквализация гистограммы и в adapthisteq - адаптивное выравнивание гистограммы. Каждый из этих методов (функций) нацелен на устранение некоторого недостатка, поэтому может быть применен для эффективной обработки такого класса изображений, на которых есть такой тип искажений.

Один из критериев выбора того или иного метода может базироваться на анализе гистограммы распределения значений яркостей элементов изображения.

figure, imhist(pout), title('pout.tif');

figure, imhist(tire), title('tire.tif');

В качестве примера рассмотрим гистограммы изображений pout.tif и tire.tif. Гистограмма изображения pout.tif занимает только центральную часть возможного диапазона яркостей. Таким образом, для растяжения динамического диапазона можно использовать функцию imadjust. Гистограмма изображения tire.tif характеризуется неравномерностью распределения. Для выравнивания гистограммы можно применить функцию histeq.