performance - MATLAB 识别 3D 图像中的相邻区域

标签 performance matlab image-processing vectorization adjacency-matrix

我有一个 3D 图像,分为相邻的区域,其中每个体素具有相同的值。分配给该地区的值是该地区唯一的,并作为标签。下面的示例图片描述了 2D 案例:

     1 1 1 1 2 2 2
     1 1 1 2 2 2 3
Im = 1 4 1 2 2 3 3
     4 4 4 4 3 3 3
     4 4 4 4 3 3 3

我想创建一个图表来描述这些区域之间的邻接关系。在上述情况下,这将是:

    0 1 0 1
A = 1 0 1 1
    0 1 0 1
    1 1 1 0

我正在寻找一种快速解决方案来在 MATLAB 中对大型 3D 图像执行此操作。我想出了一个迭代所有区域的解决方案,每次迭代需要 0.05s - 不幸的是,对于具有 32'000 个区域的图像,这将花费半个多小时。现在有人有更优雅的方式来做到这一点吗?我在下面发布当前算法:

labels = unique(Im); % assuming labels go continuously from 1 to N
A = zeros(labels);

for ii=labels
  % border mask to find neighbourhood
  dil = imdilate( Im==ii, ones(3,3,3) );
  border = dil - (Im==ii);

  neighLabels = unique( Im(border>0) );
  A(ii,neighLabels) = 1;
end

imdilate 是我想避免的瓶颈。

感谢您的帮助!

最佳答案

我想出了一个组合 Divakar 的解决方案的和teng的答案,以及我自己的修改,并将其推广到 2D 或 3D 情况。

为了提高效率,我应该预先分配 rc,但与此同时,这是运行时:

  • 对于尺寸为 117x159x126320003D 图像,单独的区域:0.79s
  • 对于上面的 2D 示例:0.004671s 使用此解决方案,0.002136s 使用 Divakar 的解决方案,0.03995s 与腾的解决方案。

不过,我还没有尝试将获胜者 (Divakar) 扩展到 3D 案例!

noDims = length(size(Im));
validim = ones(size(Im))>0;
labels = unique(Im);

if noDims == 3
    Im = padarray(Im,[1 1 1],'replicate', 'post');
    shifts = {[-1 0 0] [0 -1 0] [0 0 -1]};
elseif noDims == 2
    Im = padarray(Im,[1 1],'replicate', 'post');
    shifts = {[-1 0] [0 -1]};
end

% get value of the neighbors for each pixel
% by shifting the image in each direction
r=[]; c=[];
for i = 1:numel(shifts)
    tmp = circshift(Im,shifts{i});
    r = [r ; Im(validim)];
    c = [c ; tmp(validim)]; 
end

A = sparse(r,c,ones(size(r)), numel(labels), numel(labels) );
% make symmetric, delete diagonal
A = (A+A')>0;
A(1:size(A,1)+1:end)=0;

感谢您的帮助!

关于performance - MATLAB 识别 3D 图像中的相邻区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22810540/

相关文章:

c# - 提高C#代码效率的方法

javascript - Chart.js 数据集 Controller 'null' 绘制图表时

python - 在 python 中读取 v 7.3 mat 文件

matlab - 停止使用dsp.AudioRecorder在用户提示下进行音频录制?

c++ - OpenCV 错误:断言在 cv::Mat 行 522 中失败

c# - 使用 Lockbits C# 进行边缘检测

performance - solr 查询 - 无需扫描文件即可获得结果

sql - Oracle 对 View 使用提示索引并强制其到基表

matlab - 如何使用牛顿法求解积分的上限?

matlab - 如何在 MATLAB 上查找图像的雾度?