2012-03-07 2 views
4

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

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

Я не понимаю, почему, и я готов выбросить свой компьютер из окна. Я подозреваю, что это имеет какое-то отношение к 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 

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

+0

Нет такой вещи, как «if-loop». Если это не цикл. –

+0

@MattBurland, вы правы. Починил это. Есть идеи? –

+1

Извините, нет. У меня есть только знакомство с MatLab. Предположительно, что-то не так с вашей логикой в ​​условии if. Я заметил, что у вас есть alphaImage (yCoord, xCoord). Вы уверены, что это правильный путь? –

ответ

0

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

+0

Я не думаю, что это так. Если я изменю свой код в соответствии с вашим предложением ('ind2sub ([y x], i)'), я получаю ошибку индекса за пределами границ. –

+0

Вы изменили всю строку? Потому что у вас также были два аргумента, которые вы также назначили в обратном порядке. Должно быть: '[yCoord, xCoord] = ind2sub ([yx], i);' Я не пытался выполнить весь ваш скрипт, но эта строка определенно неверна, поскольку аргумент размера 'ind2sub' должен совпадать размер массива, или вы будете индексироваться в неправильный элемент. – mattgately

+0

Ты прав, вот и все! Хорошо, сейчас я чувствую себя довольно глупо. Спасибо за помощь! –

Смежные вопросы