重新映射任意曲线

时间:2013-03-18 20:07:00

标签: matlab image-processing transformation

enter image description here

上图中显示了两条带有一组已知像素坐标的曲线。有没有办法将外部曲线转换为圆形,然后重新映射内部曲线,以便保留两条曲线之间所有点的距离和两条曲线之间的距离?

我认为我会这样做的一种方法是将两条曲线之间的区域分成更小的四边形区域。四边形的顶部和底部将是具有预定长度的外部曲线和内部曲线。四边形的两侧在两条曲线之间横向延伸并且应该是直的。变换后,外部曲线为圆弧,内部曲线将根据预变换距离进行调整,以保持距离。为了保留区域,四边形的横向线将调整它们被定向的角度,但仍保持笔直,以保留区域。

问题在于我无法想到一种编码方式或者如何将区域划分为更小的部分。

如果对我如何解决问题有任何其他建议,我愿意接受。

1 个答案:

答案 0 :(得分:0)

我认为不可能同时保留区域和距离。如果x和y是x-的列表,则可以保留区域和比例距离(从原始图中的外圆的中心 - 即点(平均值(x),平均值(y))。原始形状的坐标和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));

在此代码中,会生成一对受到某些滤波随机噪声干扰的圆圈 - 与原始绘图(ish)类似。在极坐标中工作,生成一个圆形,其中整个原始形状适合。计算第二个圆的内点以保留原始距离。如果需要,然后通过新形状和原始形状的面积比例来缩放整个物体。

示例图:

原始形状

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

生成的形状

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