在不使用hough函数的情况下在MATLAB中进行Hough变换,超出最大变量大小时出错

时间:2014-05-20 09:47:13

标签: matlab image-processing hough-transform

我在rosetta Code的MATLAB中找到了Hough变换的实现,但该程序是作为函数编写的。我将其改为如下(隐式给出参数)

cdata=imread('p.png');
thetaSampleFrequency=1/2000;
cdata =im2bw(cdata);
[y,x]=find(cdata);

    theImage=cdata;
    %Define the hough space
    theImage = flipud(theImage);
    [width,height] = size(theImage);

    rhoLimit = norm([width height]);
    rho = (-rhoLimit:1:rhoLimit);          
    theta = (0:thetaSampleFrequency:pi);

    numThetas = numel(theta);
    houghSpace = zeros(numel(rho),numThetas);

    %Find the "edge" pixels
    [xIndicies,yIndicies] = find(theImage);

    %Preallocate space for the accumulator array
    numEdgePixels = numel(xIndicies);
    accumulator = zeros(numEdgePixels,numThetas);

    %Preallocate cosine and sine calculations to increase speed. In
    %addition to precallculating sine and cosine we are also multiplying
    %them by the proper pixel weights such that the rows will be indexed by 
    %the pixel number and the columns will be indexed by the thetas.
    %Example: cosine(3,:) is 2*cosine(0 to pi)
    %         cosine(:,1) is (0 to width of image)*cosine(0)
    cosine = (0:width-1)'*cos(theta); %Matrix Outerproduct  
    sine = (0:height-1)'*sin(theta); %Matrix Outerproduct

    accumulator((1:numEdgePixels),:) = cosine(xIndicies,:) + sine(yIndicies,:);

    %Scan over the thetas and bin the rhos 
    for i = (1:numThetas)
        houghSpace(:,i) = hist(accumulator(:,i),rho);
    end

    pcolor(theta,rho,houghSpace);
    shading flat;
    title('Hough Transform');
    xlabel('Theta (radians)');
    ylabel('Rho (pixels)');
    colormap('GRAY');
% end

但我收到了错误

  
    

???超出了程序允许的最大可变大小。

         

==>中的错误edit_hough at 24

  
accumulator = zeros(numEdgePixels,numThetas);

如何更正此错误?

1 个答案:

答案 0 :(得分:0)

首先,检查numEdgePixelsnumThetas的值是否为zeros

然后[C,MAXSIZE] = computer并检查您允许的最大元素数量(这取决于您的系统和版本 - 例如32位与64位MATLAB)。如果numEdgePixels*numThetas>MAXSIZE,那么您将始终看到该错误。

我怀疑你收到错误的真正原因是numEdgePixels太大,而且太大是因为你没有正确预处理图像。

也就是说,你借来的原始代码说:

  

此解决方案将图像和theta分辨率作为输入。该   图像本身必须是2-D布尔数组。这个数组是构造的   这样边缘上的所有像素都具有值“真”。这个可以   使用“边缘寻找”算法来完成正常图像   预处理图像。

而你所做的只是调用im2bw,这不是边缘寻找技术。请改用edge或其他内容。