7

MATLAB で数値を表すバイナリ イメージがあります。

画像の説明

すべての桁を埋めたいと思います。望ましい結果は次のとおりです。

ここに画像の説明を入力

私が見つけたのはimfill関数だけでしたが、内部データ (たとえば、9 の内側の円) を失ったので、それはあまり役に立ちませんでした。

4

3 に答える 3

6

もう1つの可能性は、BWBOUNDARIES関数を使用することです。

オブジェクトの外部境界、およびこれらのオブジェクト内の穴の境界をトレースします

その情報はA、親子ホールの依存関係を表す隣接行列である4番目の出力に含まれています。

%# read binary image
bw = imread('SUvif.png');

%# find all boundaries
[B,L,N,A] = bwboundaries(bw, 8, 'holes');

%# exclude inner holes
[r,~] = find(A(:,N+1:end));        %# find inner boundaries that enclose stuff
[rr,~] = find(A(:,r));                      %# stuff they enclose
idx = setdiff(1:numel(B), [r(:);rr(:)]);    %# exclude both
bw2 = ismember(L,idx);                      %# filled image

%# compare results
subplot(311), imshow(bw), title('original')
subplot(312), imshow( imfill(bw,'holes') ), title('imfill')
subplot(313), imshow(bw2), title('bwboundaries')

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

于 2012-06-18T17:29:10.733 に答える
5

問題は、穴と数字をどのように区別するかです。可能なアドホックな解決策は、内部のピクセルの面積によってそれらをフィルタリングすることです。

function SolveSoProblem()

    I = imread('http://i.stack.imgur.com/SUvif.png');

    %Fill all the holes 
    F = imfill(I,'holes');

    %Find all the small ones,and mark their edges in the image
    bw = bwlabel(I);
    rp = regionprops(bw,'FilledArea','PixelIdxList');
    indexesOfHoles = [rp.FilledArea]<150;   
    pixelsNotToFill = vertcat(rp(indexesOfHoles).PixelIdxList); 
    F(pixelsNotToFill) = 0;
    figure;imshow(F);

    %Remove the inner area
    bw1 = bwlabel(F,4);
    rp = regionprops(bw1,'FilledArea','PixelIdxList');
    indexesOfHoles1 = [rp.FilledArea]<150;
    pixelListToRemove = vertcat(rp(indexesOfHoles1).PixelIdxList);
    F(pixelListToRemove) = 0;

    figure;imshow(F);
end

ステップ(1)の後:

ここに画像の説明を入力

ステップ(2)の後:

ここに画像の説明を入力

于 2012-06-18T09:04:54.030 に答える
0

左上のピクセルが常に塗りつぶされる領域の外側にあると仮定します。

ピクセルを出力画像にコピーして、一番上の行を横切って作業します

入力画像で白ピクセルの後に黒ピクセルが表示されたら、出力画像で白ピクセルの設定を開始し、黒ピクセルの後に白ピクセルが表示されるようにします。

于 2012-06-18T11:26:44.233 に答える