【发布时间】:2013-03-26 14:46:48
【问题描述】:
我需要获取圆形图像的一维轮廓,例如 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
【问题讨论】:
-
好吧,一方面,您可以删除
find并直接使用逻辑索引(将循环中的第三行替换为Nvals(ii) = sum(idxs))。 MATLAB 经常在编辑器窗口中给find加下划线,告诉你它很慢。 -
您最好展示一个输入变量和函数“findC”的示例。
-
@wakjah- Nvals 并不是算法的真正组成部分,它只是一个控制变量,它告诉我输出信号中每个值的平均点数。无论如何,我也尝试过 -
sig1(ii)=mean(imR( (v-dr)<=R & R<v) )以避免find它需要相同的运行时间。 @tashuhka 函数findC使用图像和另一个参数来确定在环居中方法中使用的 2D-fft 块的大小 -
我是否正确假设您想将图像值集成到一系列环形环中?如果我这样做,我可能会预先计算每个环的索引模板,相对于任何图像的中心,将其传递给函数并相对于图像的实际中心发生位置移动值.我不明白为什么必须在运行时找到 indxs,例如左侧 10 个像素和从中心像素向上 5 个像素(例如 (128,128))将始终计入同一个环。
-
@bogle - 10x 的回复,我明白你的意思,问题是需要平均的环形数量可以从一个操作更改为另一个操作。即使我使它保持不变(并且我愿意这样做以缩短模拟运行时间),我也不知道如何使用局部随机环的中心位置有效地实施您的建议。你能举一个简短的例子来说明你的建议吗?又是 10 倍
标签: matlab image-processing signal-processing