В этом примере показано, как исследовать конформное отображение. Геометрические преобразования изображений полезны в понимании конформного отображения, которое важно в проблемах потока жидкости, и отображение себя может использоваться, чтобы преобразовать формирование изображений для интересного специального эффекта.
Конформные преобразования или отображения, имеют много важных свойств и использования. Одно свойство, относящееся к преобразованию изображений, является сохранением локальной формы (кроме иногда в изолированных точках).
Этот пример использует 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 ниже. Там, если бы мы работали просто в действительных переменных, мы должны были бы решить пару одновременных нелинейных уравнений вместо того, чтобы просто применить формулу корней квадратного уравнения!
Мы запускаем путем загрузки перечного изображения, извлечения 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- плоскость, одна внутренняя часть модульный круг и одна внешняя сторона. Копии в модульном кругу являются значительно уменьшенными, чем те снаружи. Ясно, что острые выступы вокруг центрального отверстия являются только копиями четырех углов изображений, которые сопоставили в модульном кругу.
Если преобразование создается с 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);
С двумя прямыми преобразованиями мы можем проиллюстрировать отображение сетки линий, с помощью дополнительных функций помощника.
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 на вещественной оси.
При конформном преобразовании маленькие круги должны остаться почти круговыми, изменившись только в положении и размере. Снова применяя два прямых преобразования, на этот раз мы сопоставляем регулярный массив однородно измеренных кругов.
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. Обратите внимание на то, что круги изменяются существенно, но что они остаются круги (сохранение формы, еще раз).
Чтобы далее исследовать конформное отображение, мы можем поместить вход и преобразованные изображения на паре осей, используемых в предыдущих примерах, и наложить набор кривых также.
Сначала мы отображаем входное изображение, представленное полупрозрачным образом, по входным осям конформной карты, наряду с черным эллипсом и красной линией вдоль вещественной оси.
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] на вещественной оси.
Если обратное преобразование функционирует в пользовательском 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);

Результат идентичен нашему начальному преобразованию за исключением того, что внешние углы и внутренние острые выступы были замаскированы далеко, чтобы произвести кольцевой эффект.
Применение "кольцевого" преобразования к изображению зелени (болиголов и ягоды ольхи) приводит к эстетическому специальному эффекту.
Загрузите изображение 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);

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