画像mを使用してMATLABでimerodeとimdilateを使用します
0 0 0
0 1 0
0 0 0
および構造化要素f
0
imerodeを使用した結果は次のとおりです。
inf inf inf
inf inf inf
inf inf inf
そしてimdilateのために
-inf -inf -inf
-inf -inf -inf
-inf -inf -inf
誰かが私にそれを説明できますか?
どうもありがとうございます。
画像mを使用してMATLABでimerodeとimdilateを使用します
0 0 0
0 1 0
0 0 0
および構造化要素f
0
imerodeを使用した結果は次のとおりです。
inf inf inf
inf inf inf
inf inf inf
そしてimdilateのために
-inf -inf -inf
-inf -inf -inf
-inf -inf -inf
誰かが私にそれを説明できますか?
どうもありがとうございます。
このアーティファクトは、存在しない値に構造化要素を適用するときに発生します(たとえば、境界で発生する可能性があります。この場合、中心を除外する1x1構造化要素を使用することによって発生する可能性があります)。
このような場合、MATLABimerode
とimdilate
yield-Inf
とInf
はそれぞれです。
この現象の説明については、こちらをご覧ください。
この問題を理解するには、侵食と膨張の演算子を理解する必要があります。これらの操作の一般的な一般化は、極小および最大フィルターとして行われます(構造化要素(SE)またはカーネルがフィルターする要素を選択します)。
真の要素の3x3の正方形であるSEを使用すると、侵食は、各画像要素とその8つの隣接要素すべての間の最小値を見つけることによって各画像要素の最小値を計算します。
octave> im
im =
5 9 2 6
8 5 8 1
7 8 6 9
8 4 8 1
octave> imerode (im, [1 1 1; 1 1 1; 1 1 1])
ans =
5 2 1 1
5 2 1 1
4 4 1 1
4 4 1 1
また、SEの中央要素をfalseに設定すると、8つの隣接要素すべての最小値が計算されます(SEにはそれ自体が含まれていないことに注意してください)。
octave> imerode (im, [1 1 1; 1 0 1; 1 1 1])
ans =
5 2 1 1
5 2 1 2
4 4 1 1
4 6 1 6
しかし、SEが「空」で、真の要素がない場合はどうなりますか?最小値を計算する場所から画像に要素がない場合はどうなりますか?ちょうどのSEであるユースケースは、0
真の要素がまったくないという点で非常に具体的です。侵食操作では、空のセットの最小値を計算する必要があります。空集合の最小値はいくつですか?
octave> imerode (im, [0])
ans =
Inf Inf Inf Inf
Inf Inf Inf Inf
Inf Inf Inf Inf
Inf Inf Inf Inf
答えはあまり意味がありません。しかし、操作、つまり空集合の最小値も同様です。しかし、Matlabは実際にどのようにしてこの奇妙な答えに到達するのInf
でしょうか?
Inf
and -Inf
(Octaveでも発生)の結果は、実装の詳細です。Matlabはクローズドソースであるため、どのようにしてそこに到達するかはわかりませんが、考えられるケースの擬似コードを次に示します(原則として、Octaveで発生するものと同様です)。
## pseudo-code for imerode (local-minimum) that may causes this issue
set eroded to image
for each element in image
set MIN_VAL to +Inf
for each value in element neighbourhood
if value < MIN_VAL
set MIN_VAL to value
set eroded[element index] to MIN_VAL
この操作を定義する理論的論文を調べると、通常は(離散ではなく)連続区間で、最大値と最小値の代わりに、結果が空集合の場合の上限と下限を参照していることがわかります。したがって、拡張と侵食の定義で、最大値と最小値ではなく、最大値と最小値を使用するかどうかによって異なります。また、空集合の上限と下限がとであると受け入れるかどうかにも依存します。-Inf
+Inf
-Inf
+Inf
このため、Matlabは故意に戻っInf
てきますか?-Inf
わかりませんが、しません。imerodeとimdilateのドキュメントは、maxとminの操作のみを参照しており、最も明白な実装(上記の擬似コードを参照)がこの結果につながります。
数年前にOctaveを実装imdilate
したとき、私はこれに気づいていなかったことを知っています。imerode
画像にの値がない場合、Inf
との結果として表示される方法は2つありimdilate
ますimerode
。最終結果であるInf
値は同じように見えるかもしれませんが、それらを取得する理由は完全に異なります。
この質問に関する1つの状況は、「空白の」SE、つまり真の要素を持たないSEがある場合です。その場合、画像の各ポイントで、空のセットの最小値を計算します。これはパディングとは何の関係もありません。パディングや欠落値は一切ありません。を取得する理由は、値のセット全体を実際にInf
生成してからその最小値を見つけるわけではないためです。1つの値(可能な限り最大の値)から開始し、そのセットに含まれていた次の値と比較します。そのセットは空であるため、比較は行われず、最終的にその初期値は。になります。それはこれを説明します:Inf
Inf
octave> imerode (5, 0)
ans = Inf
同じ結果につながるが質問とは関係のないもう1つのケースは、SEが画像の外側の要素のみを「選択」する場合です。これは、Mathworksブログの拡張と侵食におけるパッド値で説明されています。理論的には、侵食と拡張の操作は境界外の要素を無視します(それらは存在するべきではありません)。実際には、それらを無視すると計算コストがかかるため、それらを数えます(それ以降、画像のどこにいるかを知り、それに応じてSEを調整する必要があります)。たとえば、SEが3x3の正方形で、画像の左上隅を評価している場合、上部と左側の境界外の画像要素を回避することは困難です。したがって、Matlabは画像をInf
これらの値はminの結果に影響を与えないためです。ただし、これは、最小値を選択する値がセットに他にある場合にのみ当てはまります。画像のいずれかの時点ですべてのSEが境界外の要素である場合はInf
、パディングのみから得られた一連のsの最小値を計算します。それはこれを説明します:
octave> imerode (5, [1 1 1; 1 0 1; 1 1 1])
ans = Inf
octave> imerode (zeros (3), [0 0 0; 1 0 0; 1 1 0])
ans =
0 0 0
0 0 0
Inf 0 0
octave> imerode (zeros (3), [0 0 0; 0 0 0; 1 1 1])
ans =
0 0 0
0 0 0
Inf Inf Inf
0
実際には、それが得られる出力である場合と同等の構造化要素(SE)はありません。他の質問によると、構造要素がゼロのErose / Dilate画像strel
は、Matlabの関数の誤用にすぎません。
まず、あなたが実際にユニークなポイントであるSEを持っていると仮定しましょう0
。侵食の場合、これは、検査中の現在の位置での強度とそれ自体の間の最小値を取ることを意味します。したがって、現在の位置での強度以外に出力するものはありません。これは拡張についても同じです。それを確認するには、侵食と拡張の式を説明する正しいテキストを確認します。そして、Matlabでは:
f = [0 0 0; 0 1 0; 0 0 0]
se = strel('arbitrary', 1, 0)
imerode(f, se)
ans =
0 0 0
0 1 0
0 0 0
imdilate(f, se)
ans =
0 0 0
0 1 0
0 0 0
さて、のように無効なSEを作成し、それでse = strel('arbitrary', 0)
形態学的演算子を使おうとすると、未定義の結果しか期待できません。Matlabは素晴らしく、見るべきものを提供しています。