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

Шаг 1: Первичное преобразование изображений.

В двумерном случае, при создании обивочных материалов на основе изображений, преобразования заключаются в трансформации исходной пары координат [u v] в пару результирующих координат [x y]. Это можно представить в таком виде

x=u+a*v y=v

(1)

где является константой.

В отдельных случаях применяют аффинные преобразования, которые можно записать так как

[ x y 1 ]=[ u v 1 ]*[ 1 0 0

a 1 0

0 0 1]

(2)

Значения x и y определяются из выражения 1.

Приняв, что , создадим структуру аффинных преобразований с использованием функции maketform.

a=0.45;

T=maketform('affine', [1 0 0; a 1 0; 0 0 1] );

Теперь необходимо выбрать, считать и просмотреть изображение,

которое будет использоваться при преобразованиях.

A=imread('football.jpg');

h1=figure; imshow(A); title('Исходное изображение');

Выберем фон, на котором будет размещено это изображение, например, оранжевый. orange=[255 127 0]'; Считаем и используем параметр T для преобразования данных в A. Эти преобразования можно представить следующим образом: B=imtransform(A, T, 'cubic', 'FillValues', orange); При проведении подобного рода преобразований используют кубическую интерполяцию вдоль строк и столбцов. В данном случае, взамен этой интерполяции, будет использоваться интерполяция по ближайшей окрестности. При этом для формирования результата применяется функция imtransform. R=makeresampler({'cubic', 'nearest'}, 'fill'); B=imtransform(A, T, R, 'FillValues', orange); h2=figure; imshow(B);

Шаг 2: Исследование преобразований.

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

Скрипт ipex001 формирует сетку из линий, наложенную на исходное изображение и отображает на нем. Этот программный продукт содержится в /toolbox/images/imdemos/ipex001.m.

ipex001

Скрипт ipex002 реализует ту же процедуру, только с использованием окружностей. Этот программный продукт содержится в /toolbox/images/imdemos/ipex002.m.

ipex002

Шаг 3: Сравнительный анализ различных методов.

При реализации технологии вырезания изображений, функция imtransform заполняет оранжевыми треугольниками места, где нет данных. Известно пять модификаций рассматриваемого метода. При этом используется пять различных параметров ('fill', 'replicate', 'bound', 'circular' и 'symmetric'). Проведем сравнительный анализ первых трех параметров.

Первая опция 'fill' вместе с опциями 'XData' и 'YData' используется в функции imtransform для принудительной установки фона вокруг изображения.

Bf=imtransform(A, T, makeresampler({'cubic', 'nearest'},...

'fill'), 'XData', [-49 500], 'YData', ...

[-49 400], 'FillValues', orange);

figure, imshow(Bf);

title('Pad Method=''fill''');

При использовании второй опции 'replicate' нет необходимости в заполнении пространства вокруг исходного изображения.

Br=imtransform(A, T, makeresampler({'cubic', 'nearest'}, ...

'replicate'), 'XData', [-49 500], 'YData', ...

[-49 400]);

figure, imshow(Br);

title('Pad Method=''replicate''');

Теперь рассмотрим применение третьей опции 'bound'.

Bb=imtransform(A, T, makeresampler({'cubic', 'nearest'}, ...

'bound'), 'XData', [-49 500], 'YData', ...

[-49 400], 'FillValues', orange);

figure, imshow(Bb);

title('Pad Method=''bound''');

Результаты обработки исходного изображения с помощью исследуемого метода при установке опций 'fill' и 'bound' являются очень похожими. Разница состоит в том, что при использовании опции 'bound' при обработке используется кубическая интерполяция и результирующее изображение получается немного размытым. Рассмотрим этот момент более детально и проанализируем результаты обработки с использованием двух опций ('fill' и 'bound') на элементном уровне.

Cf=imtransform(A, T, makeresampler({'cubic', 'nearest'}, ...

'fill'), 'XData', [423 439], 'YData', ...

[245 260], 'FillValues', orange);

Cb=imtransform(A, T, makeresampler({'cubic', 'nearest'}, ...

'bound'), 'XData', [423 439], 'YData', ...

[245 260], 'FillValues', orange);

Cf=imresize(Cf, 12, 'nearest');

Cb=imresize(Cb, 12, 'nearest');

figure;

subplot(1, 2, 1); imshow(Cf); title('Pad Method=''fill''');

subplot(1, 2, 2); imshow(Cb); title('Pad Method=''bound''');