2013-03-18 5 views
0
произвольного

enter image description hereпереназначения кривые

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

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

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

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

+0

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

+0

Есть ли способ пойти по пикселям на одну из линий и найти векторы между пикселями на одной строке и пикселем на другом? – user2183777

+0

Вы можете попробовать 'bwboundaries', а затем пройти через точки. Но на внешней границе больше точек, чем внутренних, поэтому подход кажется бесполезным. – Justin

ответ

0

Я не думаю, что можно сохранить как площадь, так и расстояние. Можно сохранить площадь и пропорциональное расстояние (от центра внешнего круга в исходном чертеже - т. Е. Точка (среднее (x), среднее (y)), если x и y - список x- коорды и y-координаты исходной формы) или только расстояние. Ниже приводится иллюстративный пример:

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

% Area normalisation flag 
norm_area = true; 

% Start with two circles, perturb them randomly 
N = 100; 
phi = linspace(0, 2*pi, N)'; 

% Set radii 
r = [2 4]; 

% Generate data 
r_pert = repmat(r, N, 1); 

% Filter some random data (so it's smoothish) 
filtOrd = 20; 
b = ones(1, filtOrd)/filtOrd; 
randData = filter(b, 1, randn(size(r_pert))); 
randData = bsxfun(@minus, randData, mean(randData)); 
r_pert = r_pert + randData; 

% Initial plot 
close all; 
polar(phi, r_pert(:, 2)); 
hold on; 
polar(phi, r_pert(:, 1)); 

% Generate circle that encloses all radii 
r_pureCirc = max(r_pert(:)); 

% Line lengths 
lens = abs(r_pert(:, 2) - r_pert(:, 1)); 

r_pertCirc = r_pureCirc - lens; 

% Calculate area of new and old shapes 
% Elemental area is a pie slice between phi(n) - dphi/2 and phi + dphi/2 
dphi = phi(2) - phi(1); 
dA_orig = dphi * (r_pert(:, 2) .^ 2 - r_pert(:, 1) .^ 2)/2; 
dA_new = dphi * (r_pureCirc .^ 2 - r_pertCirc .^ 2)/2; 
A_orig = sum(dA_orig); 
A_new = sum(dA_new); 

r_new = [r_pertCirc repmat(r_pureCirc, N, 1)]; 
if norm_area 
    % Normalise to same area 
    r_new = sqrt(A_orig/A_new) * r_new; 
end 

% Plot again 
figure; 
polar(phi, r_new(:, 2)); 
hold on; 
polar(phi, r_new(:, 1)); 

В этом коде, пара кругов возмущенных некоторой фильтрованной случайный шум генерируется - похожий на ваш оригинальный рисунок (МОГ). Работая в полярных координатах, создается круг, в котором подходит вся оригинальная форма. Внутренние точки второго круга рассчитываются для сохранения расстояний в оригинале. При желании все это затем масштабируется соотношением площадей новой и оригинальной формы.

Пример участков:

Оригинальная форма

Original shape http://i47.tinypic.com/nmyrg5.jpg

Сформирован Форма

Generated shape http://i50.tinypic.com/35ivxn4.jpg

+0

** Я не думаю, что можно сохранить как площадь, так и расстояние. ** Почему? Кроме того, что, если бы я хотел сохранить периметры двух кругов? Будет ли часть, которая масштабирует два круга в соответствии с их областями, все еще работает для сохранения области? Также, как вы сохраняете расстояние между двумя линиями? Скажете ли вы, что это 1-1 картография? – user2183777

+0

Как я уже сказал в своем правлении, я теперь ** думаю ** думаю, что можно сохранить оба. Но вам нужно будет создать объективную функцию и оптимизировать ее (может быть аналитическое выражение, если вы действительно изучите его, но, вероятно, проще просто оптимизировать численно). Расстояние сохраняется, вычисляя исходное расстояние в полярных координатах (на основе контрольной точки в центре исходного внешнего круга), создавая новый внешний круг и вычитая исходные расстояния от его полярного радиуса, чтобы получить новый внутренний круг. У меня больше нет символов, чтобы ответить на ваши вопросы. – wakjah

+0

** Нормализовать в том же районе: ** Почему вы берете sqrt из соотношения площадей? Кроме того, будет ли этот метод нормализовать работу области, если области области были вычислены с использованием функции regionprops? – user2183777