5

ご覧のとおり、図形とその白い境界線があります。形を白色で塗りつぶしたい。

入力は次のとおりです。 ここに画像の説明を入力

私はこの出力を取得したいと思います: http://s12.postimage.org/z3txnlb3f/untitled33.png

このコードを手伝ってくれる人はいますか? 黒の楕円が白に変わることはありません。どうもありがとう :]]

I = imread('untitled4.bmp');
Ibw = im2bw(I);
CC = bwconncomp(Ibw); %Ibw is my binary image
stats = regionprops(CC,'pixellist');

% pass all over the stats
for i=1:length(stats),
size = length(stats(i).PixelList);
% check only the relevant stats (the black ellipses)
if size >150 && size < 600 
    % fill the black pixel by white    
    x = round(mean(stats(i).PixelList(:,2)));
    y = round(mean(stats(i).PixelList(:,1)));
    Ibw = imfill(Ibw, [x, y]);
end;
end;

imshow(Ibw);
4

2 に答える 2

3

コードは次のように改善および簡略化できます。まず、BWCONNCOMPIbwを否定して使用し、4連結成分を見つけると、各黒領域のインデックスが得られます。次に、接続された領域をその中のピクセル数で並べ替え、最大の2つを除くすべてを選択すると、すべての小さい円形領域のインデックスが得られます。最後に、これらの小さな領域の線形インデックスを収集して、領域を白で塗りつぶすために使用できます。コードは次のとおりです(かなり短く、ループは必要ありません)。

I = imread('untitled4.bmp');
Ibw = im2bw(I);

CC = bwconncomp(~Ibw, 4);
[~, sortIndex] = sort(cellfun('prodofsize', CC.PixelIdxList));

Ifilled = Ibw;
Ifilled(vertcat(CC.PixelIdxList{sortIndex(1:end-2)})) = true;
imshow(Ifilled);

そして、これが結果の画像です:

ここに画像の説明を入力してください

于 2012-04-07T16:26:39.897 に答える
1

画像がすべて白黒で、画像処理ツールキットがある場合、これは必要なもののように見えます: http://www.mathworks.co.uk/help/toolbox/images/ref/imfill.html

何かのようなもの:

imfill(image, [startX, startY])

ここで、startX、startY は、塗りつぶしたい領域のピクセルです。

于 2012-04-07T12:35:41.613 に答える