2017-04-20 19 views
1

enter image description here別の領域

が含まれていない領域を分離するためにどのようにクロスシー、YC、ZCマトリックス、赤、緑、青のプロットでのみ3つのカラーチャンネルが存在しています。 zC行列の値は、青の場合は1、緑の場合は2、赤の場合は3です。

青を含んでいるが、周囲に浮かんでいる緑だけは分離したいと思っています。

inb=zC==1; 
xCb = xC(inb); %isolate blue 
yCb = yC(inb); 

ing=zC==2;  %isolate green 


xCg = xC(ing); 
yCg = yC(ing); 


inFg = inpolygon(xCb,yCb,xCg,yCg); %tried inpolygon 

in=zC==2; 
zg = zC(in); %This is not correct 
zgV = zg(~inFg); 

答えて

1

あなたが機能imfillregionpropsを使用するImage Processing Toolboxへのアクセスを持っていると仮定すると、ここに一つの解決策だ:

blueMask = (zC == 1); % Mask of blue regions 
greenMask = (zC == 2); % Mask of green regions 

% Fill "holes" in the green mask, then get a list of pixel indices for each filled blob: 
greenCC = regionprops(imfill(greenMask, 'holes'), 'PixelIdxList'); 

% Find which blobs have pixel indices that index any blue pixels: 
blobIndex = cellfun(@(index) any(blueMask(index)), {greenCC.PixelIdxList}); 

% Collect pixel indices from these filled blobs: 
greenIndex = vertcat(greenCC(blobIndex).PixelIdxList); 

% Remove the indices of the filled holes: 
greenIndex = greenIndex(greenMask(greenIndex)); 

これはあなたに緑の地域内の全画素に対して線形インデックスgreenIndexのセットを提供します青色の領域を囲む。ここで

1

あなたは、画像処理ツールボックスへのアクセス権を持っていると仮定し、別のソリューションです:

% find green pixels with neighboring blue pixels. The linear indices will 
% be stored in inds 
zC_ = zeros(size(zC)+2); 
zC_(2:(end-1),2:(end-1)) = zC; 
neighboors = (zC==2) & ... 
    ((zC_(1:(end-2),1:(end-2))==1) |... 
    (zC_(1:(end-2),2:(end-1))==1) |... 
    (zC_(1:(end-2),3:end)==1) |... 
    (zC_(2:(end-1),1:(end-2))==1) |... 
    (zC_(2:(end-1),3:end)==1) |... 
    (zC_(3:end,1:(end-2))==1) |... 
    (zC_(3:end,2:(end-1))==1) |... 
    (zC_(3:end,3:end)==1)); 
inds = find(neighboors); 

% find all connected regions of green pixels which are in the vector inds. 
% result will be stored in inds2. 
conn = bwlabeln(zC==2); 
inds2 = ismember(conn(:),unique(conn(inds))); 

% create an output image with 0's anywhere beside the regions you need are 
% interested in 
out = zeros(size(zC)); 
out(inds2) = 1;