【问题标题】:profile of circular image - more efficient way to do it?圆形图像的轮廓 - 更有效的方法?
【发布时间】:2013-03-26 14:46:48
【问题描述】:

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

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

ma​​tlab 分析器显示 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)&lt;=R &amp; R&lt;v) ) 以避免find 它需要相同的运行时间。 @tashuhka 函数 findC 使用图像和另一个参数来确定在环居中方法中使用的 2D-fft 块的大小
  • 我是否正确假设您想将图像值集成到一系列环形环中?如果我这样做,我可能会预先计算每个环的索引模板,相对于任何图像的中心,将其传递给函数并相对于图像的实际中心发生位置移动值.我不明白为什么必须在运行时找到 indxs,例如左侧 10 个像素和从中心像素向上 5 个像素(例如 (128,128))将始终计入同一个环。
  • @bogle - 10x 的回复,我明白你的意思,问题是需要平均的环形数量可以从一个操作更改为另一个操作。即使我使它保持不变(并且我愿意这样做以缩短模拟运行时间),我也不知道如何使用局部随机环的中心位置有效地实施您的建议。你能举一个简短的例子来说明你的建议吗?又是 10 倍

标签: matlab image-processing signal-processing


【解决方案1】:

根据 cmets,这是我可能会尝试的一个示例。让我们使用一个 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

现在手头有一个名为 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

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

【讨论】:

  • 嗨@bogle,例如10x。通常,环中心可以在子像素单元内移动。所以这是该任务的部分解决方案。 (我需要准确计算窦的相位)检查结果中圆环中心到最近像素的含义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2021-04-25
  • 2015-04-26
  • 2021-01-23
  • 2019-01-26
相关资源
最近更新 更多