exponenta event banner

Исследование конформного отображения

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

Шаг 1: выберите конформное преобразование

Конформные преобразования или отображения, имеют много важных свойств и использования. Одно свойство, относящееся к преобразованию изображений, является сохранением локальной формы (кроме иногда в изолированных точках).

Этот пример использует 2D конформное преобразование, чтобы деформировать изображение. Отображение от выхода, чтобы ввести, g: R^2 -> R^2, задан в терминах комплексной аналитической функции G: C -> C, где

  G(z) = (z + 1/z) / 2.

Мы задаем g через прямое соответствие между каждой точкой (x,y) в R^2 (Евклидова плоскость) и точка z = x + i*y в C (комплексная плоскость),

  g(x,y) = (Re(w),Im(w)) = (u,v)

где

  w = u + i*v = G(x + i*y).

Это конформное отображение важно в гидроаэромеханике, потому что это преобразовывает линии потока вокруг кругового диска (или цилиндр, если мы добавляем третью размерность) к прямым линиям. (См. стр 340-341 в Странге, Гильберте, Введении в Прикладную математику, Wellesley-Кембриджское Нажатие, Веллесли, MA, 1986.)

Примечание по значению комплексных переменных: несмотря на то, что мы могли описать определение g непосредственно в терминах x и y, это затенило бы базовую простоту преобразования. Этот недостаток заставил бы нас пожалеть на Шаге 3 ниже. Там, если бы мы работали просто в действительных переменных, мы должны были бы решить пару одновременных нелинейных уравнений вместо того, чтобы просто применить формулу корней квадратного уравнения!

Шаг 2: Warp изображение Используя конформное преобразование

Мы запускаем путем загрузки перечного изображения, извлечения 300 500 подызображение и отображения его.

 A = imread('peppers.png');
 A = A(31:330,1:500,:);
 figure
 imshow(A)
 title('Original Image','FontSize',14)

Затем используйте maketform сделать пользовательский tform struct с указателем, чтобы функционировать conformalInverse как его INVERSE_FCN аргумент:

conformal = maketform('custom', 2, 2, [], @conformalInverse, []);

К представлению conformalInverse использование:

type conformalInverse.m
function U = conformalInverse(X, ~)
% conformalInverse Inverse conformal transformation.
%
% Supports conformal transformation example, ConformalMappingImageExample.m
% ("Exploring a Conformal Mapping").

% Copyright 2005-2013 The MathWorks, Inc. 

Z = complex(X(:,1),X(:,2));
W = (Z + 1./Z)/2;
U(:,2) = imag(W);
U(:,1) = real(W);

Горизонталь и вертикальные границы необходимы для отображения оригинальных и преобразованных изображений к комплексным плоскостям ввода и вывода. Обратите внимание на то, что пропорции в uData и vData совпадайте с отношением высоты к ширине оригинального изображения (3/5).

uData = [ -1.25   1.25];  % Bounds for REAL(w)
vData = [  0.75  -0.75];  % Bounds for IMAG(w)
xData = [ -2.4    2.4 ];  % Bounds for REAL(z)
yData = [  2.0   -2.0 ];  % Bounds for IMAG(z)

Мы применяем imtransform использование SIZE параметр, чтобы гарантировать соотношение сторон, которое совпадает с пропорциями в xData и yData (6/5), и представление результат.

B = imtransform( A, conformal, 'cubic', ...
                'UData', uData,'VData', vData,...
                'XData', xData,'YData', yData,...
                'Size', [300 360], 'FillValues', 255 );
figure
imshow(B)
title('Transformed Image','FontSize',14)

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

На самом деле каждая точка во входной w-плоскости сопоставлена с двумя точками в выходе z- плоскость, одна внутренняя часть модульный круг и одна внешняя сторона. Копии в модульном кругу являются значительно уменьшенными, чем те снаружи. Ясно, что острые выступы вокруг центрального отверстия являются только копиями четырех углов изображений, которые сопоставили в модульном кругу.

Шаг 3: создайте прямые преобразования

Если преобразование создается с maketform имеет прямую функцию, затем мы можем применить tformfwd к регулярным геометрическим объектам (в частности, к прямоугольным сеткам и универсальным массивам кругов), чтобы получить дальнейшее понимание преобразования. В этом примере, потому что G карты две выходных точки к каждой точке ввода, нет никакого уникального прямого преобразования. Но мы можем продолжить, если мы осторожны и работаем с двумя различными прямыми функциями.

Разрешение w = (z + 1/z)/2 и решение квадратного уравнения, которое заканчивается,

z^2 + 2*w*z + 1 = 0,

мы находим это

z = w +/- sqrt{(w^2 - 1).

Положительное и отрицательные квадратные корни приводят к двум отдельным прямым преобразованиям. Мы создаем первое использование maketform и указатель на функцию, conformalForward1.

t1 = maketform('custom', 2, 2, @conformalForward1, [], []);

К представлению conformalForward1 использование:

type conformalForward1.m
function X = conformalForward1(U, ~)
% conformalForward1 Forward transformation with positive square root.
%
% Supports conformal transformation example, ConformalMappingImageExample.m
% ("Exploring a Conformal Mapping").

% Copyright 2005-2013 The MathWorks, Inc. 

W = complex(U(:,1),U(:,2));
Z = W + sqrt(W.^2 - 1);
X(:,2) = imag(Z);
X(:,1) = real(Z);

Мы создаем второе преобразование с другой функцией, которая идентична conformalForward1 за исключением изменения знака.

t2 = maketform('custom', 2, 2, @conformalForward2, [], []);

type conformalForward2.m
function X = conformalForward2(U, ~)
% conformalForward2 Forward transformation with negative square root.
%
% Supports conformal transformation example, ConformalMappingImageExample.m
% ("Exploring a Conformal Mapping").

% Copyright 2005-2013 The MathWorks, Inc. 

W = complex(U(:,1),U(:,2));
Z = W - sqrt(W.^2 - 1);
X(:,2) = imag(Z);
X(:,1) = real(Z);

Шаг 4: исследуйте отображение Используя линии сетки

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

f3 = figure('Name','Conformal Transformation: Grid Lines');
axIn  = conformalSetupInputAxes( subplot(1,2,1));
axOut = conformalSetupOutputAxes(subplot(1,2,2));
conformalShowLines(axIn, axOut, t1, t2)

% Reduce wasted vertical space in figure
f3.Position = [1 1 1 0.7] .* f3.Position;

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

Шаг 5: исследуйте отображение Используя упакованные круги

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

f4 = figure('Name','Conformal Transformation: Circles');
axIn  = conformalSetupInputAxes( subplot(1,2,1));
axOut = conformalSetupOutputAxes(subplot(1,2,2));
conformalShowCircles(axIn, axOut, t1, t2)

% Reduce wasted vertical space in figure
f4.Position = [1 1 1 0.7] .* f4.Position;

Вы видите, что преобразование к упаковке круга, где касания были сохранены. В этом примере расцветка указывает на использование положительного (зеленого) или отрицательного (синего) квадратного корня из w^2 - 1. Обратите внимание на то, что круги изменяются существенно, но что они остаются круги (сохранение формы, еще раз).

Шаг 6: исследуйте отображение Используя изображения

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

Сначала мы отображаем входное изображение, представленное полупрозрачным образом, по входным осям конформной карты, наряду с черным эллипсом и красной линией вдоль вещественной оси.

figure
axIn = conformalSetupInputAxes(axes);
conformalShowInput(axIn, A, uData, vData)
title('Original Image Superposed on Input Plane','FontSize',14)

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

figure
axOut = conformalSetupOutputAxes(axes);
conformalShowOutput(axOut, B, xData, yData)
title('Transformed Image Superposed on Output Plane','FontSize',14)

Графика MATLAB® дала возможность переключать и масштабировать оригинальные и преобразованные изображения, чтобы наложить их на входе (w-) и выход (z-) плоскости, соответственно. Использование полупрозрачности облегчает видеть эллипс, линию и круги. Эллипс в w-плоскости имеет точки пересечения в 5/4 и-5/4 на горизонтальной оси и 3/4 и-3/4 на вертикальной оси. G карты два круга, сосредоточенные на источнике к этому эллипсу: тот с радиусом 2 и тот с радиусом 1/2. И, как показано в красном, G сопоставляет модульный круг с интервалом [-1 1] на вещественной оси.

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

Если обратное преобразование функционирует в пользовательском tform struct возвращает вектор, заполненный NaN для данного местоположения выходного изображения, затем imtransform (и также tformarray) присвойте заданное значение заливки в том местоположении. На этом шаге мы повторяем Шаг 1, но изменяем нашу обратную функцию преобразования немного, чтобы использовать в своих интересах эту функцию.

type conformalInverseClip.m
function U = conformalInverseClip( X, ~)
% conformalInverseClip Inverse conformal transformation with clipping.
%
% This is a modification of conformalInverse in which points in X
% inside the circle of radius 1/2 or outside the circle of radius 2 map to
% NaN + i*NaN.
%
% Supports conformal transformation example, ConformalMappingImageExample.m
% ("Exploring a Conformal Mapping").

% Copyright 2000-2013 The MathWorks, Inc. 

Z = complex(X(:,1),X(:,2));
W = (Z + 1./Z)/2;
q = 0.5 <= abs(Z) & abs(Z) <= 2;
W(~q) = complex(NaN,NaN);
U(:,2) = imag(W);
U(:,1) = real(W);

Это совпадает с функцией, определяемой на Шаге 2, за исключением двух дополнительных линий:

q = 0.5 <= abs(Z) & abs(Z) <= 2;
W(~q) = complex(NaN,NaN);

которые заставляют обратное преобразование возвращать NaN в любой точке не между этими двумя кругами с радиусами 1/2 и 2, сосредоточенный на источнике. Результат состоит в том, чтобы замаскировать тот фрагмент выходного изображения с заданным значением заливки.

ring = maketform('custom', 2, 2, [], @conformalInverseClip, []);
Bring = imtransform( A, ring, 'cubic',...
                    'UData', uData,  'VData', vData,...
                    'XData', [-2 2], 'YData', yData,...
                    'Size', [400 400], 'FillValues', 255 );
figure
imshow(Bring)
title('Transformed Image With Masking','FontSize',14);

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

Шаг 8: повторите эффект на различном изображении

Применение "кольцевого" преобразования к изображению зелени (болиголов и ягоды ольхи) приводит к эстетическому специальному эффекту.

Загрузите изображение greens.jpg, который уже имеет 3/5 отношение высоты к ширине, и отобразите его.

C = imread('greens.jpg');
figure
imshow(C)
title('Winter Greens Image','FontSize',14);

Преобразуйте изображение и отобразите результат, на этот раз создав квадратное выходное изображение.

D = imtransform( C, ring, 'cubic',...
                 'UData', uData, 'VData', vData,...
                 'XData', [-2 2], 'YData', [-2 2],...
                 'Size', [400 400], 'FillValues', 255 );
figure
imshow(D)
title('Transformed and Masked Winter Greens Image','FontSize',14);

Заметьте, что локальные формы объектов в выходном изображении сохраняются. Ягоды ольхи остались круглыми!