2012-03-07 3 views
4

matlabにいくつかの問題がありますがわかりません。次のコードは画像のコレクションを分析し、一貫性のある画像を返します(いつもそうしました)。Matlabでind2subを使用した後に説明できない結果

しかし、if-conditionは2番目の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の実際のサイズは、あなたがxCoordyCoordで正しい場所をインデックス化されていません[y x]です。

+0

それはそれだとは思いません。あなたの提案( 'ind2sub([y x]、i)')に応じてコードを変更すると、範囲外のインデックスを取得します。 –

+0

行全体を変更しましたか?あなたはまたあなたが逆に割り当てていた2つの議論を持っていたからです。 '[yCoord、xCoord] = ind2sub([yx]、i);' スクリプト全体を実行しようとはしませんでしたが、この行は確かに間違っています。配列のサイズ、または間違った要素にインデックスを付けることになります。 – mattgately

+0

あなたはそうです、それでした!さて、私は今、かなり馬鹿だと感じています。助けてくれてありがとう! –

関連する問題