Tin*_*Tin 5 optimization performance matlab image-processing histogram
我想要在圆形邻域内计算局部直方图的图像.邻域的大小由a给出radius.虽然下面的代码完成了这项工作,但它的计算成本却很高.我运行探查器,我访问圆形社区内的像素的方式已经很昂贵了.
是否有任何基于矢量化的改进/优化?或者,例如,将邻域存储为列?我在这篇文章中发现了一个类似的问题,所提出的解决方案完全符合下面代码的精神,但是解决方案仍然不适合我的情况.任何想法都非常受欢迎:-)想象一下,目前图像是二进制的,但该方法也应理想地与灰度图像一起使用:-)
[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
Run Code Online (Sandbox Code Playgroud)
编辑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
Run Code Online (Sandbox Code Playgroud)
您可以尝试使用相反的逻辑进行处理(如评论中简要解释的那样)
hist = zeros(W+2*R, H+2*R, Q);
for i = 1:R+1;
for j = 1:R+1;
if ((i-R-1)^2+(j-R-1)^2 < R*R)
for q = 0:1:Q-1;
hist(i:i+W-1,j:j+H-1,q+1) += (image == q);
end
end
end
end
Run Code Online (Sandbox Code Playgroud)