非線形フィルタリング
これらの機能では、形状を強調するため、またはノイズを除去するために、近傍ピクセルの非線形の組み合わせが使用されます。
ほとんどの場合は破壊的な機能であるため(トップハットおよびメディアンフィルタを除く)、 ソース画像は目的画像によって上書きされます。 破壊的な演算は速度が高まります。
いずれの場合も、例えばErodeBoxとBiLevelErodeBoxのように、グレー画像とバイレベル同等物があります。
- これにより、カーネルに必要とされる形状が定義されます(通常は3x3マトリックス内)。
- このカーネルを画像上に重ね合わせて、一致が見つかったときに結果画像のピクセル値が算出されます:
- 侵食、膨張:画像領域を縮小/拡大させます。
- オープニング、クロージング:画像領域の境界ピクセルを除去します/追加します。
- 間引き、濃厚化:画像パターンマッチングを用いて侵食/膨張を行います。
- トップハットフィルタ:小さい画像ディテールをすべて残しながらその他の要素を取り除きます。
- 形態距離:ピクセルを黒にするために侵食が何回必要であるかを示します。
- 形態勾配:侵食および膨張プロセスの外側および内側のエッジを示します。
- メディアンフィルタ:インパルス性ノイズを除去します。
- ヒットアンドミス変換:前景/背景ピクセルのパターンを検出し、スケルトンを作成します。

半分の幅=3および半分の高さ=2の長方形カーネル(左)、半分の幅 =2の円形カーネル(右)
モルフォロジー演算子は、指定された形状(正方形、長方形または円形)の近傍の値を組み合わせ、その結果の値で中心ピクセルを置き換えます。
侵食、膨張およびメディアンフィルタの3つの特別なケースが最もよく使用されます。このとき、Kは1(集合の最小)、N(最大)または N/2(中央値)となります。
侵食、膨張、オープニング、クロージング、トップハットおよび形態勾配の演算では、片方のサイズの長方形または円形カーネルが使用されます。 カーネルサイズは結果に大きく影響します。
例
半分の幅/半分の高さ |
実際の幅/高さ |
---|---|
0 |
1 |
1 |
3 |
2 |
5 |
3 |
7 |

侵食は白のオブジェクトを縮小して黒のオブジェクトを拡大し、膨張はその反対が行われます。
![]() ![]() |
![]() ![]() |
侵食 | 膨張 |
侵食は白のオブジェクトのエッジに沿ってピクセル層を取り除くことで、白のオブジェクトを細くします (ErodeBox、ErodeDisk)。 カーネルのサイズを大きくするほど、白のオブジェクトがなくなり、黒のオブジェクトが大きくなります。
膨張は黒のオブジェクトのエッジに沿ってピクセル層を追加することで、白のオブジェクトを太くします (DilateBox、DilateDisk)。 カーネルのサイズを大きくするほど、白のオブジェクトが大きくなり、黒のオブジェクトがなくなります。

トップハットフィルタは不均一な照明の改善に優れた効果を発揮します。
白のトップハットフィルタ:ソース画像と目的画像
1枚の画像とそのオープニング(またはクロージング)間の差を抽出します。 そのため、オープニング(またはクロージング)によって消去される特徴が保持されます。 結果として、平坦な背景に、カーネルサイズよりも小さい黒または白の特徴のみが現れます。
- 白のトップハットフィルタは白の細い特徴を強調します (WhiteTopHatBox、WhiteTopHatDisk)。
- 黒のトップハットフィルタは黒の細い特徴を強調します (BlackTopHatBoxBlackTopHatDisk)。

距離 は2値画像(黒は0、白は0以外)の形態距離(ピクセルを黒にするための侵食の回数)を計算し、目的画像を作成します。目的画像の各ピクセルには、ソース画像で対応するピクセルの形態距離が含まれます。

形態勾配ではエッジ検出が行われ、エッジを除くすべての要素が除去されます。
形態勾配は、同構造の要素を用いた画像の膨張と侵食の差です。
MorphoGradientBox、MorphoGradientDisk
膨張 – 侵食 = 勾配

メディアンフィルタはエッジや画像の鮮鋭度を保持しながらインパルス性ノイズを除去します。
正方形 (3x3) カーネルを用いて近傍のメディアン(中央値)で各ピクセルを置き換えるため、外側のピクセルは排除されます。
メディアンフィルタ:ソース画像と目的画像

ヒットアンドミス変換はBW8、BW16、C24画像またはROIに使用することができ、画像から前景/背景ピクセルの特定のパターンを検出します。
ヒットアンドミス変換
HitAndMiss 関数には3つの引数があります:
- ソース画像形式を示すポインタ(EROIBW8、EROIBW16またはEROIC24)
- ソース画像形式に応じた目的画像の種類を示すポインタ。
ソース画像と目的画像のサイズは同じでなければなりません。 - EHitAndMissKernelタイプのカーネル:カーネルオブジェクトで2つのコンストラクタを使用できます:
- EHitAndMissKernel(int startX、int startY、int endX、int endY)
startX、startYはカーネルの左上の座標であり、ゼロ以下でなければなりません。
endX、endYはカーネルの右下の座標であり、ゼロ以上でなければなりません。
明確なサイズの制限がなく、次の特徴を持つカーネルが構築されます:
カーネル幅 = (endX – startX + 1)、カーネル高さ = (endY – startY + 1) - EHitAndMissKernel(unsigned int halfSizeX、unsigned int halfSizeY)ここで、
halfSizeXはカーネルの半分の幅 - 1で、ゼロより大きくなるはずです。
halfSizeYはカーネルの高さの半分 - 1で、ゼロより大きくなるはずです。
次の特徴を持つカーネルが構築されます:
カーネル幅 = ((2 x halfSizeX) + 1)、、カーネル高さ = ((2 x halfSizeY) + 1)
kernel StartX = - halfSizeX、kernel StartY = - halfSizeY
- EHitAndMissKernel(int startX、int startY、int endX、int endY)

ヒットアンドミス変換はコーナーの位置を特定するために使用できます。
2値ソース画像
1. 左コーナーを検出してカーネルを定義します。 左コーナーのピクセルのすぐ左、上、下には黒のピクセルがあり、すぐ右には白のピクセルがあります。 左コーナーは次のヒットアンドミスカーネルによって検出されます:
- +
- + +
- +
2. ソース画像にフィルタを適用します。 結果画像が適切にサイズ調整されているか確認してください。
結果画像:強調されたピクセルは菱形の左コーナーに位置している
3. 同様にして残りの3つのコーナーの位置を検出します。上記フィルタを回転させた3つのカーネルを宣言し、適用します。
4. 右、上、下のコーナーを検出します。