2

いくつかの接続されたコンポーネントのバイナリイメージがあります。いくつかは大きいものといくつかは小さいものです(おそらく1ピクセルのみ)。これにより、接続された各コンポーネントを、接続されたBLOBではなくチェッカーパターンにする方法を効率的に模索しています。

これまでのところ、これを試すことができる2つの方法を考え出しましたが、エラーが発生するか、非常に非効率になる可能性があります。

  1. 画像全体を知っているので、チェッカーパターンマスクを作成してピクセルの50%を削除できます。これは非常に高速ですが、平均して、領域が1ピクセルしかない連結成分の50%を削除します。

  2. MATLAB / Octaveで使用bwlabel()し、接続された各コンポーネントをループして、1ピクセルを超える場合にのみそのコンポーネントにマスクを適用します(ループがそれらに到達したときに他のコンポーネントを考慮します)。これは非常に非効率的です。

使用できるスマート/組み込みソリューションはありますか?

例

図を生成するコード

T = zeros(40,40);
T(10:30,10:30) = 1;

chessVec = repmat([1;0],20,1);

T_wanted = (repmat([chessVec circshift(chessVec,1)],1,20).*T);

figure();
subplot(1,2,1);imshow(T);title('Start shape')
subplot(1,2,2);imshow(T_wanted);title('Wanted shape');
4

1 に答える 1

7

効率性のためにブランケットチェッカーに勝るものはありません。次に行う必要があるのは、接続されている小さなコンポーネントを追加し直すことだけです。

%# create a test image
img = rand(100)>0.8;
img = imclose(img,ones(5));
img = imerode(img,strel('disk',2));

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

%# get connected components
%# use 4-connect to preserve
%# the diagonal single-pixel lines later
cc = bwconncomp(img,4)

%# create checkerboard using one of Matlab's special matrix functions
chk = invhilb(100,100) < 0;

%# checker original image, add back small stuff
img(chk) = 0;

smallIdx = cellfun(@(x)x<2,cc.PixelIdxList);
img([cc.PixelIdxList{smallIdx}]) = 1;

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

于 2012-09-07T13:57:29.853 に答える