2013-03-18 63 views
0

enter image description here重新映射arbitary曲线

两条曲线与一组已知的像素坐标的在高于图像被示出。有没有办法将外部曲线转换为圆形,然后重新映射内部曲线,以便两条曲线之间的所有点的距离与两条曲线之间的区域都保留下来?

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

问题是,我想不出一种方法来编码或如何将区域分割成较小的部分。

如果有任何其他建议,我可以如何解决我的问题,我向他们开放。

+0

我认为这将是很难界定的距离如何点之间保持在曲线转换后的两条曲线。但是,由于区域被保留,所以您直接知道圆圈的半径将位于右侧图像的外部曲线上。你可以从那里开始。 – Justin 2013-03-18 21:15:46

+0

有没有一种方法可以逐行扫描像素,并找到一行像素与另一行像素之间的矢量? – user2183777 2013-03-19 01:09:27

+0

你可以试试'bwboundaries'然后通过点。但是,外部边界会比内部更多点,所以这种方法似乎是徒劳的。 – Justin 2013-03-19 04:54:05

回答

0

我不认为有可能保存面积和距离。如果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

+0

**我不认为有可能保存面积和距离。**为什么是这样?另外,如果我想保留两个圆的边界呢?根据它们的区域缩放两个圆的部分是否仍然用于保存区域?另外,你如何保持两条线之间的距离?你会说它是1-1映射吗? – user2183777 2013-03-25 18:08:01

+0

正如我在编辑中所说的,我现在**认为可以保留两者。但是你必须产生一个目标函数并对其进行优化(如果你真的关注它,可能会有一个分析表达式,但是只是在数值上进行优化可能更容易)。通过计算极坐标中的原始距离(基于原始外圆中心的参考点),生成一个新的外圆,并从其极半径减去原始距离以获得新的内圆来保留距离。我没有更多的人物可以回答你的问题。 – wakjah 2013-03-25 21:36:34

+0

**标准化为相同的区域:**为什么要采用sqrt的面积比?另外,如果使用函数regionprops计算区域面积,这种方法是否可以使面积正常化? – user2183777 2013-04-08 15:33:12