减少Matlab循环

时间:2014-10-31 08:22:18

标签: matlab

% read image
I = imread(im);
H = zeros(256,1);
% m = width, n = height
[m,n] = size(I);

% loop for checking values
for GrayValue = 0:255
    for i = 1:m
        for j = 1:n
            if I(i,j) == GrayValue % read each pixel coordinate
                H(GrayValue+1) = H(GrayValue+1)+1;
            end
        end
    end
end

此功能将图像文件作为im获取,并显示图像中值的直方图。如何减少执行此MATLAB功能所需的时间。它类似于imhist()。但我想做一个类似的imhist()函数。我无法弄清楚要删除哪个循环。

2 个答案:

答案 0 :(得分:2)

强制性bsxfun解决方案:

H=sum(bsxfun(@eq,I(:),0:255))

一种可能更容易理解的方法。这只是用搜索替换你的两个内部循环。

I=randi(256,50,50)-1;
H=zeros(256,1);

G=zeros(256,1);
for GrayValue=0:255
    [ii,jj]=find(I==GrayValue);
    G(GrayValue+1)=length(ii);
end

答案 1 :(得分:1)

假设I是灰度图像,您可以使用 histc 来获取H -

H = sum(histc(I,0:255),2)

因此,完整的代码将是 -

% read image
I = imread(im);
H = sum(histc(I,0:255),2)

如果您正在寻找一些不太高级的代码,您可以避免一个嵌套循环 -

% read image
I = imread(im);
H = zeros(256,1);

% loop for checking values
for GrayValue = 0:255
    for i = 1:numel(I)
        if I(i) == GrayValue % read each pixel coordinate
            H(GrayValue+1) = H(GrayValue+1)+1;
        end
    end
end