3

私はバイナリイメージを持っています。ピクセル値 = 1 を見つけて、現在のピクセルとしてラベル付けしたいと考えています。次に、その 8 つの隣接ピクセル値を合計します。現在のピクセルの 8 近傍ピクセル値の合計 = 1 の場合、その現在のピクセルをマーカーでマークします。次のようなバイナリ イメージの一部:

0 0 0 0
0 1 0 0
0 0 1 1 0
0 0 0 1
0 0 0 0 0

次のmatlabコードを試しましたが、いくつかのエラーがあります(この行で -> Sums = sum(currentPix, nOffsets);).どうすれば修正できますか?


Sums = 0; 
S = size(BW,1);
nOffsets = [S, S+1, 1, -S+1, -S, -S-1, -1, S-1]';  %8-neighbors offsets
BW_Out = BW;

for row=1:S    
   for col=1:S 
     if BW(row,col),
         break; 
      end 
   end 

   idx = sub2ind(size(BW),row,col);
   neighbors = bsxfun(@plus, idx, nOffsets); 
   currentPix = find(BW==1); %if found 1, define it as current pixel 

     while ~isempty(currentPix)

        % new current pixel list is  set of neighbors of current list.
        currentPix = bsxfun(@plus, currentPix, nOffsets);
        currentPix = currentPix(:);
        Sums = sum(currentPix, nOffsets); %error at this line

        if (Sums==1)   %if the sum of 8-neighbor values = 1, mark ROI
            plot(currentPix,'r*','LineWidth',1);
        end

        % Remove from the current pixel list pixels that are already
        currentPix(BW_Out(currentPix)) = [];

        % Remove duplicates from the list.
        currentPix = unique(currentPix);
    end
end   
4

1 に答える 1

3

実際にはこれを1行で実行できると思います(カーネルを定義した後)

I = [0 0 0 0 0
     0 1 0 0 0
     0 0 1 1 0
     0 0 0 0 1
     0 0 0 0 0];

K = [1 1 1;
     1 0 1;
     1 1 1;];

(conv2(I,K,'same')==1) & I

ans =

   0   0   0   0   0
   0   1   0   0   0
   0   0   0   0   0
   0   0   0   0   1
   0   0   0   0   0

これを分割する:

M = conv2(I,K, 'same'); %// convolving with this specific kernel sums up the 8 neighbours excluding the central element (i.e. the 0 in the middle)

(M==1) & I %// Only take results where there was a 1 in the original image.
于 2013-10-03T08:32:37.773 に答える