Необъяснимые результаты после использования ind2sub в Matlab - PullRequest
4 голосов
/ 07 марта 2012

У меня проблемы с матлабом, я не понимаю. Следующий фрагмент кода анализирует коллекцию изображений и должен возвращать связное изображение (и всегда так).

Но поскольку я поместил условие if во второй цикл for (для целей оптимизации), он возвращает чересстрочное изображение.

Я не понимаю, почему, и я готовлюсь выбросить мой компьютер в окно. Я подозреваю, что это как-то связано с ind2sub, но, насколько я вижу, все работает просто отлично! Кто-нибудь знает, почему он это делает?

function imageMedoid(imageList, resizeFolder, outputFolder, x, y)

    % local variables
    medoidImage = zeros([1, y*x, 3]);
    alphaImage = zeros([y x]);
    medoidContainer = zeros([y*x, length(imageList), 3]);

    % loop through all images in the resizeFolder
    for i=1:length(imageList)

        % get filename and load image and alpha channel
        fname = imageList(i).name;
        [container, ~, alpha] = imread([resizeFolder fname]);

        % convert alpha channel to zeros and ones, add to alphaImage
        alphaImage = alphaImage + (double(alpha) / 255);

        % add (r,g,b) values to medoidContainer and reshape to single line
        medoidContainer(:, i, :) = reshape(im2double(container), [y*x 3]);

    end

    % loop through every pixel
    for i=1:(y * x)

        % convert i to coordinates for alphaImage
        [xCoord, yCoord] = ind2sub([x y],i);

        if alphaImage(yCoord, xCoord) == 0

            % write default value to medoidImage if alpha is zero
            medoidImage(1, i, 1:3) = 0;

        else

        % calculate distances between all values for current pixel
        distances = pdist(squeeze(medoidContainer(i,:,1:3)));

        % convert found distances to matrix of distances
        distanceMatrix = squareform(distances);

        % find index of image with the medoid value
        [~, j] = min(mean(distanceMatrix,2));

        % write found medoid value to medoidImage
        medoidImage(1, i, 1:3) = medoidContainer(i, j, 1:3);

        end

    end

    % replace values larger than one (in alpha channel) by one
    alphaImage(alphaImage > 1) = 1;

    % reshape image to original proportions
    medoidImage = reshape(medoidImage, y, x, 3);

    % save medoid image
    imwrite(medoidImage, [outputFolder 'medoid_modified.png'], 'Alpha', alphaImage);

end

Я не включил весь код, только эту функцию (для краткости), если кому-то нужно больше (для лучшего понимания), пожалуйста, дайте мне знать, и я включу его.

1 Ответ

0 голосов
/ 08 марта 2012

Когда вы звоните ind2sub, вы даете размер [x y], но фактический размер alphaImage равен [y x], поэтому вы не индексируете правильное местоположение с помощью xCoord и yCoord.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...