4

私は5x5のブール行列のセットを持っています.1つは以下の例です:

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

そして、接続された一連の 1 ごとに出力する方法が必要です (接続されているとは、1 が左、右、別の 1 の上または下にあることを意味し、対角線はカウントされません) x 軸上で占める長さと長さy 軸を占めます。この行列の EG 左から右にずっと続くものがあるため、x に 5 単位、y に 4 単位です。

  1
1 1 1
1     1 1
1 1 1 1

右上隅には、x に 2 つの単位があり、y に 1 つのみのセットもあります。

      1 1

右下には、x で 1、y で 1 しか占めないものがあります。

この行列に対して、xmax1=5 ymax1=4、xmax2=2 ymax2=1、xmax3=1 ymax3=1 の行に沿って何かを出力したいと思います。私は正しい行に沿っているいくつかのコードを作成することができましたが、単純な行列に対してのみ機能します。たとえば、接続された 1 のセットが 1 つしかなく、xmax と ymax が単純な直線である場合です。たとえば、次の場合に実行できます。

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

最長の x パスは上を横切る直線であり、最長の y max は下への直線です。ただし、「蛇行」し始めた場合は、次のようになります。

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

ymax=3 と xmax=3 の結果は、最も離れた直線からの実際の長さではなく、最長の直線であるため、この場合は ymax=5 と xmax になります。 =4

私はMatLabを初めて使用し、自分自身を教えようとしているため、機能する多くの方法を考えることができると思いますが、それらを実装する方法を考えることができません. 複数の方法を試しましたが、それらを適切に実装する方法がよくわかりません。

助けてくれてありがとう。

4

2 に答える 2

1

これらのコンポーネントのいくつかのプロパティの計算を容易にするために呼び出して、 4 連結コンポーネントとその機能を識別します。bwconncomp()regionprops()

A = [0 1 0 1 1
     1 1 1 0 0
     1 0 0 1 1
     1 1 1 1 0
     0 0 0 0 1]

s = regionprops(bwconncomp(A,4),'BoundingBox');

sは非スカラー構造であり、各コンポーネントのバウンディング ボックスパラメータ、つまり[upper-left corner x, upper-left corner y, xwidth, ywidth].

例えば:

s(1)
ans = 
    BoundingBox: [0.5 0.5 5 4]

3 つの接続されたコンポーネントがあることに注意してください (1 つの要素もカウントされます)。

bwconncomp(A,4)
ans = 
    Connectivity: 4
       ImageSize: [5 5]
      NumObjects: 3
    PixelIdxList: {[11x1 double]  [2x1 double]  [25]}
于 2013-08-21T22:54:41.023 に答える
0

Image Processing Toolbox がある場合は、関数regionpropsが役立つ場合があります。連結成分 (隣接する 1 の領域) に関するあらゆる種類の情報を返します。

返すことができる機能の 1 つは、接続されたコンポーネントの各要素のインデックスを識別します。これらを ind2sub を使用して添字に変換し、インデックスの最大値と最小値を調べることができます。

foo = rand(5,5) < 0.5;
stats = regionprops(foo, 'PixelIdxList');
[y,x] = ind2sub(stats(1).PixelIdxList) % index list for first region
max(y) - min(y) % length in y
max(x) - min(x) % length in x

regionprops によって返されるその他の機能のいくつかは、何をしていても役立つことに気付くかもしれません。見てください。:)

于 2013-08-21T22:54:13.983 に答える