我需要获得圆形图像的一维轮廓,例如 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