Last modified 9 years ago Last modified on 06/06/08 18:34:20

mist::euclidean::distance_transform の出力がユークリッド距離だと思って計算していたら,どうも値が違うようです.これは「2乗」ユークリッド距離ということでしょうか.

mist::euclidean::distance_transform は,画素のアスペクトを考慮したユークリッド2乗距離を計算します.MISTで実装しているユークリッド2乗距離変換では,X軸方向の画素の大きさを1としたときの比を用いて2乗距離値を計算しています.画素の大きさを考慮したユークリッド距離を利用したい場合は, 計算結果の平方根に画素のX軸方向の解像度(大きさ)を掛けてください.


3次元画像の細線化処理を使用する際に,出力画像の型を mist::array3<unsigned char> にすると、適切な細線化画像が求まらないことがあるようです.

MISTで実装されている細線化アルゴリズムでは,出力画像の画像に対してユークリッド2乗距離変換し,その後,細線化処理を行います.そのため,出力画像が mist::array3<unsigned char> の場合には,画像のサイズによっては距離変換が最後まで正しく行われません.これは,2乗距離の最大値が unsinged char の最大値で制限されるためです.細線化を利用する場合には,mist::array3<unsigned short> か,それよりも大きい値を表現できる型を利用してください.


mist::array3<unsigned char> の画像に対してラベリング処理を行ったのですが,各領域に正しくラベルが振られません.

MISTで実装しているラベリング処理では,mist::array3<unsigned char> の画像に対して各領域のラベルを順次割り振っていきます.その際,処理中に割り振られるラベル数が unsigned char の最大値よりも大きくなった場合は,正しくラベルが割り振られません.ここで,ラベル数とは最終的に得られる領域の数ではなく,作業中に発生する一時的なラベル数のことを意味しています.そのため,最終的に得られる領域数(最終的なラベル数)がunsigned char の最大値よりも小さい場合でも,正しく計算されない場合があります.ラベリング処理を利用する場合には,ラベル数がオーバーフローしないように注意が必要であり,mist::array3<unsigned short> や mist::array3<unsigned int>を利用することをお勧めします.


細線化処理を使用する際に,出力画像の型を mist::array3<整数型>とすると適切な細線化画像が求まらないことがあります.

MISTで実装されている細線化アルゴリズムでは,出力画像に対してユークリッド2乗距離変換を行った後,細線化処理を行います.このとき行うユークリッド2乗距離変換では,画素のアスペクトを考慮した変換を行います.具体的には,X軸方向の画素の解像度を基準とした比を計算し,これらを2乗距離変換の結果に反映させます. このとき,アスペクト比が1より小さくなると2乗距離の値が1より小さな浮動小数点数になることがあります. すると,出力画像がmist::array3<整数型>の場合には,このような2乗距離の値は切り捨てられて0になってしまい,細線化処理の結果が正しく得られない場合があります. このような事態を回避するため,細線化処理を利用する際には,アスペクト比が1でない場合は出力画像をmist::array3<float>やmist::array3<double>などとすることをお勧めします. なおリビジョン [1111]以降では,アスペクト比が1でない,かつ,出力画像がmist::array3<float>やmist::array3<double>でない場合,アスペクト比を1にした後で細線化処理が行われるようになっています.