【发布时间】:2014-03-12 03:20:52
【问题描述】:
我有一张图像,我想在其上计算圆形邻域内的局部直方图。邻域的大小由radius 给出。尽管下面的代码可以完成这项工作,但它的计算成本很高。我运行分析器,我访问圆形邻域内的像素的方式已经很昂贵了。
是否有任何基于矢量化的改进/优化?或者例如,将社区存储为列? 我在post 中发现了一个类似的问题,并且建议的解决方案非常符合下面代码的精神,但是该解决方案仍然不适合我的情况。任何想法都非常受欢迎:-) 现在想象一下,图像是二进制的,但该方法也应该理想地适用于灰度图像:-)
[rows,cols] = size(img);
hist_img = zeros(rows, cols, 2);
[XX, YY] = meshgrid(1:cols, 1:rows);
for rr=1:rows
for cc=1:cols
distance = sqrt( (YY-rr).^2 + (XX-cc).^2 );
mask_radii = (distance <= radius);
bwresponses = img(mask_radii);
[nelems, ~] = histc(double(bwresponses),0:255);
% do some processing over the histogram
...
end
end
编辑 1 鉴于收到的反馈,我尝试更新解决方案。但是,它还不正确
radius = sqrt(2.0);
disk = diskfilter(radius);
fun = @(x) histc( x(disk>0), min(x(:)):max(x(:)) );
output = im2col(im, size(disk), fun);
function disk = diskfilter(radius)
height = 2*ceil(radius)+1;
width = 2*ceil(radius)+1;
[XX,YY] = meshgrid(1:width,1:height);
dist = sqrt((XX-ceil(width/2)).^2+(YY-ceil(height/2)).^2);
circfilter = (dist <= radius);
end
【问题讨论】:
-
当速度真的很重要时,我会为它混合 c 函数
-
也许可以尝试
blockproc,块大小为radius,并仅在每个块的内切圆上计算直方图。 -
看吧,块处理和移动过滤器不一样。
-
@Jigg 是正确的。根据您在第一次尝试中所做的事情,您可能应该改用
colfilt或im2col。 -
对于二值图像,您只需将图像添加到 N 个不同的位置,其中 N 是圆形内核中的像素数。对于灰度级,(矩阵)操作数为 N*(Q-1),其中 Q 是量化级数。
标签: performance matlab optimization image-processing histogram