0

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

我已经为该任务编写了一个 matlab 函数,但结果证明效率很低。该函数对原始图像的半径间隔进行平均。

matlab 分析器显示 for 循环 [indxs=find(...)] 中的第一行占用了约 86% 的运行时间。

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

有谁知道我怎样才能让这段代码运行得更快?也许有人有另一种更有效的方式来完成任务?

我还尝试使用 matlab 编码器将函数转换为 C++ 和 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
4

1 回答 1

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

然后你的面具的索引是,让我们说 [kn]

 >> [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

现在手头有一个名为 B 的 9x9 零矩阵,我们可以使用公式 (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

只要它不超出范围,您应该能够通过简单的添加来移动单个环形蒙版,以将中心放在图像中心。

于 2013-03-27T00:56:55.003 回答