Ticket #18 (closed バグ報告: fixed)

Opened 11 years ago

Last modified 9 years ago

saito::inverse_distance_transform() の不具合?

Reported by: dfuru Owned by: ddeguchi
Priority: Milestone:
Component: Mist Version:
Keywords: Cc:

Description

saito::inverse_distance_transform()の不具合について確信が持てないのですが,念のため報告しておきます.検証用のコードとサンプル画像を添付します.入力・出力画像は, short型, 32x24x1 の2次元画像です.こちらの環境は,64bit版のWindowsです.

distance.hの493行目

value_type nn = static_cast< value_type >( *op - ( n + 1 ) * ( n + 1 ) * as2 );

を疑っています.

  1. *op - ( n + 1 ) * ( n + 1 )が負の値をとった.
  2. unsigned型のarrayを入力にすると, value_typeがunsigned型になる.
  3. それゆえnnにUINT_MAXが入る.

私が実装した逆距離変換のルーチンは,上述の理由で壊れた結果を出力しました. が,そもそも1. について,

  1. *op - ( n + 1 ) * ( n + 1 )が,理論上,負の値をとりえるのか,
  2. アルゴリズムが間違っている/どこかの実装が間違っているために,*op - ( n + 1 ) * ( n + 1 )が負の値をとったのか,

が私には良く分かりません. 齋藤先生のPRUの原稿を読んだ限りでは前者だと思うのですが,確信が持てません.

また,mistの使い方が間違っている,そもそも逆距離変換を勘違いしている(理解できていない), など,全然関係ないところで躓いているのかもしれません. そこで,相談も兼ねて報告しました. よろしくお願いします.

Attachments

test_saito.cc (1.5 KB) - added by dfuru 11 years ago.
検証用コード
32x24x1.raw (1.5 KB) - added by dfuru 11 years ago.
入力画像
dist.raw (1.5 KB) - added by dfuru 11 years ago.
距離画像
output.raw (1.5 KB) - added by dfuru 11 years ago.
逆距離変換画像

Change History

Changed 11 years ago by dfuru

検証用コード

Changed 11 years ago by dfuru

入力画像

Changed 11 years ago by dfuru

距離画像

Changed 11 years ago by dfuru

逆距離変換画像

comment:1 in reply to: ↑ description Changed 11 years ago by ddeguchi

  • Owner changed from somebody to ddeguchi
  • Status changed from new to assigned

バグ報告ありがとうございます。

saito::inverse_distance_transform()の不具合について確信が持てないのですが,念のため報告しておきます.検証用のコードとサンプル画像を添付します.入力・出力画像は, short型, 32x24x1 の2次元画像です.こちらの環境は,64bit版のWindowsです.

こちらでも同様の問題が発生することを確認しました。

distance.hの493行目

value_type nn = static_cast< value_type >( *op - ( n + 1 ) * ( n + 1 ) * as2 );

を疑っています.

  1. *op - ( n + 1 ) * ( n + 1 )が負の値をとった.
  2. unsigned型のarrayを入力にすると, value_typeがunsigned型になる.
  3. それゆえnnにUINT_MAXが入る.

おっしゃる通り、1. が原因で nn に UINT_MAX が入るのが問題でした。

私が実装した逆距離変換のルーチンは,上述の理由で壊れた結果を出力しました. が,そもそも1. について,

  1. *op - ( n + 1 ) * ( n + 1 )が,理論上,負の値をとりえるのか,
  2. アルゴリズムが間違っている/どこかの実装が間違っているために,*op - ( n + 1 ) * ( n + 1 )が負の値をとったのか,

が私には良く分かりません. 齋藤先生のPRUの原稿を読んだ限りでは前者だと思うのですが,確信が持てません.

理論上負の値をとる可能性があるにもかかわらず、nn の結果の代入先をちゃんとチェックしていなかったのがそもそもの原因だった模様です。

  1. に関しては問題ないとは思うのですが、いろいろな図形で調査してみないとわからないですね。

また,mistの使い方が間違っている,そもそも逆距離変換を勘違いしている(理解できていない), など,全然関係ないところで躓いているのかもしれません. そこで,相談も兼ねて報告しました. よろしくお願いします.

mist の使い方自体は間違っていないと思います。 ただ、RAW データを出力する mist/io/raw.h もあるので、そちらを利用してもよいかなと思いました。 また、何か問題があったらお知らせください。

comment:2 Changed 9 years ago by ddeguchi

  • Status changed from assigned to closed
  • Resolution set to fixed
Note: See TracTickets for help on using tickets.