圆形图像的轮廓 - 更有效的方法吗?

时间:2013-03-26 14:46:49

标签: matlab image-processing signal-processing

我需要获得圆形图像的一维轮廓,例如256x256 sin(R)图像 256x256 sin(R) image

我为这项任务编写了一个matlab函数,但事实证明它非常无效。 该函数平均原始图像的半径间隔。

matlab profiler显示for-loop中的第一行[indxs = find(...)] 需要约86%的运行时间。

我需要在成千上万的模拟图像(一些大于256x256)上运行该功能,并且需要很长时间才能完成。

有谁知道如何让这段代码运行得更快? 也许某人有另一种更有效的方法来完成任务?

我也尝试将功能转换为C ++&使用matlab编码器的mex文件 但是执行任务需要更长时间(x3),可能是因为子功能 - “findC” 使用一些2D-ffts来找到图像的中心。

谢谢大家, 杜达斯

我的Matlab功能:

function [sig R_axis Center]= Im2Polar (imR,ch,Center_Nblock)
% Converts Circular image to 1-D sig
% based on true image values w/o interpolation

% Input -
% imR - circular sinuns image
% ch - number of data-points in output signal (sig)
% Center_Nblock - a varible related to the image center finding method

% Output -
% sig - 1D vector of the circular image profile
% R_axis - axis data-points for sig
% Center - image center in pixels


[Mr Nr] = size(imR); % size of rectangular image
[Center]=findC(imR,Center_Nblock);
Xc=Center(1);
Yc=Center(2);

rMax=sqrt((Mr/2)^2 + (Nr/2)^2);

x=[0:1:Mr-1]-Xc+1;
y=[0:1:Nr-1]-Yc+1;

[X,Y]=meshgrid(x,y);
[TH,R] = cart2pol(X,Y);

% Assembling 1-D signal
sig=single([]);
ii=1;
dr=floor(rMax)/ch;
V=dr:dr:floor(rMax);

for v=V
    indxs=find((v-dr)<=R & R<v);**
    sig(ii)=mean(imR(indxs));
    Nvals(ii)=length(indxs);

    ii=ii+1;
end %for v

R_axis=V-dr/2;

end % of function

1 个答案:

答案 0 :(得分:1)

根据这里的评论,我可能会尝试一些例子。让我们使用9x9示例。假设您有以下环形。

A =

 0     0     0     0     0     0     0     0     0
 0     0     1     1     1     1     1     0     0
 0     1     1     1     0     1     1     1     0
 0     1     1     0     0     0     1     1     0
 0     1     0     0     0     0     0     1     0
 0     1     1     0     0     0     1     1     0
 0     1     1     1     0     1     1     1     0
 0     0     1     1     1     1     1     0     0
 0     0     0     0     0     0     0     0     0

那么你的掩码的索引就是,[k n]

 >> [k n]

 ans =

 3     2
 4     2
 5     2
 6     2
 7     2
 2     3
 3     3
 4     3
 6     3
 7     3
 8     3
 2     4
 3     4
 7     4
 8     4
 2     5
 8     5
 2     6
 3     6
 7     6
 8     6
 2     7
 3     7
 4     7
 6     7
 7     7
 8     7
 3     8
 4     8
 5     8
 6     8
 7     8

现在手头有一个9x9的零矩阵,叫做B,我们可以使用公式(i + 9 *(j-1))将整个事物向左移动一个像素,将双索引转换为单一指数。

 >> B=zeros(9,9);
 >> B((k)+9*(n-2))=1

 B =

 0     0     0     0     0     0     0     0     0
 0     1     1     1     1     1     0     0     0
 1     1     1     0     1     1     1     0     0
 1     1     0     0     0     1     1     0     0
 1     0     0     0     0     0     1     0     0
 1     1     0     0     0     1     1     0     0
 1     1     1     0     1     1     1     0     0
 0     1     1     1     1     1     0     0     0
 0     0     0     0     0     0     0     0     0

或向下移动到右侧,如下所示

 >> B=zeros(9,9);
 >> B((k+1)+9*(n-0))=1

 B =

 0     0     0     0     0     0     0     0     0
 0     0     0     0     0     0     0     0     0
 0     0     0     1     1     1     1     1     0
 0     0     1     1     1     0     1     1     1
 0     0     1     1     0     0     0     1     1
 0     0     1     0     0     0     0     0     1
 0     0     1     1     0     0     0     1     1
 0     0     1     1     1     0     1     1     1
 0     0     0     1     1     1     1     1     0

只要它没有超出范围你就应该能够通过一个简单的添加来移动一个环形掩模,将中心放在图像中心。