Преобразование Хафа в MATLAB без использования функции Хафа, ошибка из-за превышения максимального размера переменной

Я нашел реализацию преобразования Хафа в MATLAB в коде rosetta, но эта программа написана как функция. Я изменил это следующим образом (параметры указаны неявно)

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

Но я получаю ошибку

??? Превышен максимальный размер переменной, разрешенный программой.

Ошибка в ==> edited_hough в 24

accumulator = zeros(numEdgePixels,numThetas);

как исправить эту ошибку?


person bushra    schedule 20.05.2014    source источник


Ответы (1)


Во-первых, проверьте, каковы ваши значения numEdgePixels, numThetas в точке, которую вы вызываете zeros.

Затем [C,MAXSIZE] = computer и проверьте максимально допустимое количество элементов (это зависит от вашей системы и версии — например, 32-битный или 64-битный MATLAB). Если numEdgePixels*numThetas>MAXSIZE, то вы всегда будете видеть эту ошибку.

Я подозреваю, что настоящая причина, по которой вы получаете сообщение об ошибке, заключается в том, что numEdgePixels слишком велико, а оно слишком велико из-за того, что вы неправильно выполняете предварительную обработку своего изображения.

То есть исходный код, который вы позаимствовали, говорит:

Это решение использует изображение и тета-разрешение в качестве входных данных. Само изображение должно быть двумерным логическим массивом. Этот массив построен таким образом, что все пиксели на краю имеют значение «истина». Это можно сделать для обычного изображения, используя алгоритм «поиска краев» для предварительной обработки изображения.

В то время как все, что вы делаете, это вызываете im2bw, что не является методом поиска краев. Вместо этого используйте edge или что-то в этом роде.

person nkjt    schedule 20.05.2014
comment
предварительно обработанное изображение как cdata=edge(cdata); но теперь этот код работает для образца изображения, показанного на этом сайте. но получая сообщение об ошибке для других изображений (ошибка показана ниже), я также проверил нет: краевых пикселей. Это ошибка 12891: ??? Недостаточно памяти. Введите HELP MEMORY для ваших вариантов. Ошибка в ==> edited_hough на 37 аккумуляторе ((1: numEdgePixels),:) = косинус (xIndicies,:) + синус (yIndicies,:); - person bushra; 20.05.2014