我不认为有可能保存面积和距离。如果x和y是x的列表,则可以保留区域和比例距离(从原始图形中外圆的中心 - 即点(mean(x),mean(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
我认为这将是很难界定的距离如何点之间保持在曲线转换后的两条曲线。但是,由于区域被保留,所以您直接知道圆圈的半径将位于右侧图像的外部曲线上。你可以从那里开始。 – Justin 2013-03-18 21:15:46
有没有一种方法可以逐行扫描像素,并找到一行像素与另一行像素之间的矢量? – user2183777 2013-03-19 01:09:27
你可以试试'bwboundaries'然后通过点。但是,外部边界会比内部更多点,所以这种方法似乎是徒劳的。 – Justin 2013-03-19 04:54:05