1次元エッジ検出
[画像フィルタ]


説明

1次元エッジ検出について

直線または、円弧上の計測ラインから濃度プロファイル(濃度を格納した配列)を生成して、 その濃度プロファイルを基として1次元上のエッジを検出します。 本ライブラリは、基礎となる処理をする低レベル関数と、低レベル関数を組み合わせた応用関数から構成されています。 ユーザーは、必要に応じて低レベル関数を組み合わせることで、 提供した応用関数以外の1次元エッジ検出関数を作成することができます。

検出アルゴリズム

以下に、指定した一つの計測ラインから1次元エッジを検出する場合の処理フローを示します。
fie_edge1d_flow.png

処理フロー

濃度プロファイル

濃度プロファイルは、直線または、円弧形状から選択できます。
fie_edge1d_projection_line.png

濃度プロファイル(直線)

fie_edge1d_projection_arc.png

濃度プロファイル(円弧)

濃度プロファイルは、計測ラインの一部が入力画像に含まれている場合に生成されます。 ただし、計測ライン部分が入力画像に含まれておらず、対応する片幅領域のみが入力画像に含まれている場合は、 有効領域には含まれません。 あくまで、計測ラインを基準として有効領域が設定されます。
また、線形補間で濃度を取得するため、画像の横幅を $w$ pixel, 縦幅を $h$ pixel としたとき 計測ライン上の座標 $(x,y)$$ 0 \leq x < w-2 $ かつ $ 0 \leq y < h-2 $ であれば 座標 $(x,y)$ は入力画像に含まれているとします。

計測ラインが直線の場合、濃度プロファイル内の有効領域は1つとなります。 有効領域の位置は、濃度プロファイルの先頭からのオフセット量と長さとして取得されます。 緑色で塗りつぶされている部分が有効領域となります。 図では、濃度プロファイル生成領域内の画素の中心が、入力画像内に含まれている場合に有効領域としています。

fie_edge1d_projection_line2.png

濃度プロファイルの有効領域

fie_edge1d_projection_line3.png

濃度プロファイルの有効領域のオフセットと長さ

計測ラインが円弧の場合、濃度プロファイル内の有効領域は複数存在します。 下図に、円弧の角度を $2\pi$ で指定した場合の例を示します。 この場合、有効領域は最大で5つとなります。
実際には、円弧の角度に制限を設けていません。 そのため、1つの濃度プロファイル内に最大で「濃度プロファイルの長さ÷2」の有効領域が存在することになります。 有効領域の位置は、濃度プロファイルの先頭からのオフセット量と長さの配列として取得されます。

fie_edge1d_projection_arc1.png

有効領域が1つの場合の例

fie_edge1d_projection_arc2.png

有効領域が2つの場合の例

fie_edge1d_projection_arc3.png

有効領域が3つの場合の例

fie_edge1d_projection_arc4.png

有効領域が4つの場合の例

fie_edge1d_projection_arc5.png

有効領域が5つの場合の例


モジュール

 低レベル関数

データ構造

struct  F_ARRAY_INDEX
 配列の有効領域指定構造体 [詳細]
struct  F_EDGE1D_DIFF_FILTER
 1次元エッジ用微分フィルタ [詳細]
struct  F_ARC
 円弧型構造体 [詳細]

列挙型

enum  f_edge1d_filter { F_EDGE1D_DOG, F_EDGE1D_CORR }
 エッジ検出フィルタの種類 [詳細]
enum  f_edge1d_edge_direction {
  F_DRK_TO_BRI = 0, F_BRI_TO_DRK = 1,
  F_DTC_BOTH = 2
}
 エッジ方向 [詳細]
enum  f_diff_type { F_ABSOLUTE_THR = 0, F_RELATIVE_THR = 1 }
 濃度差しきい値種別 [詳細]
enum  f_edge1d_sort_mode { F_MAG_SORT = 0, F_POS_SORT = 1 }
 エッジの保存順 [詳細]
enum  f_edge1d_projection_mode { F_PROJECTION_BOX = 0, F_PROJECTION_FAN = 1 }
 濃度投影方法 [詳細]

関数

INT FVALGAPI fnFIE_edge1d_line (FHANDLE hsrc, DSGMT_T line, INT prj_width, enum f_edge1d_filter filter_mode, enum f_edge1d_edge_direction direct_mode, enum f_diff_type diff_type, DOUBLE diff_thr, enum f_edge1d_sort_mode sort_mode, F_DEDGE **edges, INT *edge_num)
 計測ライン(線分)上からの複数エッジ点の検出
INT FVALGAPI fnFIE_edge1d_line2 (FHANDLE hsrc, DSGMT_T line, INT prj_width, F_EDGE1D_DIFF_FILTER diff_filter, INT arnd, INT interval, enum f_edge1d_edge_direction direct_mode, enum f_diff_type diff_type, DOUBLE diff_thr, enum f_edge1d_sort_mode sort_mode, F_DEDGE **edges, INT *edge_num, INT **diff, INT *diff_len)
 計測ライン(線分)上からの複数エッジ点の検出
INT FVALGAPI fnFIE_edge1d_arc (FHANDLE hsrc, F_ARC arc, INT prj_width, enum f_edge1d_filter filter_mode, enum f_edge1d_edge_direction direct_mode, enum f_diff_type diff_type, DOUBLE diff_thr, enum f_edge1d_sort_mode sort_mode, F_DEDGE **edges, INT *edge_num)
 計測ライン(円弧)上からの複数エッジ点の検出
INT FVALGAPI fnFIE_edge1d_arc2 (FHANDLE hsrc, F_ARC arc, INT prj_width, F_EDGE1D_DIFF_FILTER diff_filter, INT arnd, INT interval, enum f_edge1d_edge_direction direct_mode, enum f_diff_type diff_type, DOUBLE diff_thr, enum f_edge1d_sort_mode sort_mode, F_DEDGE **edges, INT *edge_num, INT **diff, INT *diff_len)
 計測ライン(円弧)上からの複数エッジ点の検出
INT FVALGAPI fnFIE_edge1d_radial (FHANDLE hsrc, DPNT_T center, INT start_radius, INT range_radius, DOUBLE start_angle, DOUBLE range_angle, INT line_num, enum f_edge1d_projection_mode prj_mode, INT prj_width, enum f_edge1d_filter filter_mode, enum f_edge1d_edge_direction direct_mode, enum f_diff_type diff_type, DOUBLE diff_thr, enum f_edge1d_sort_mode detect_mode, F_DEDGE **edges, INT *edge_num)
 放射状(収束or発散)方向エッジ検出

列挙型

エッジ検出フィルタの種類

列挙型の値:
F_EDGE1D_DOG  ガウシアン1次微分
F_EDGE1D_CORR  相関エッジ

エッジ方向

列挙型の値:
F_DRK_TO_BRI  暗→明のエッジ
F_BRI_TO_DRK  明→暗のエッジ
F_DTC_BOTH  両極性

濃度差しきい値種別

列挙型の値:
F_ABSOLUTE_THR  絶対濃度差
F_RELATIVE_THR  相対濃度差

エッジの保存順

列挙型の値:
F_MAG_SORT  強度順
F_POS_SORT  始点からの位置順

濃度投影方法

列挙型の値:
F_PROJECTION_BOX  矩形型濃度プロファイル
F_PROJECTION_FAN  扇型濃度プロファイル


関数

INT FVALGAPI fnFIE_edge1d_line ( FHANDLE  hsrc,
DSGMT_T  line,
INT  prj_width,
enum f_edge1d_filter  filter_mode,
enum f_edge1d_edge_direction  direct_mode,
enum f_diff_type  diff_type,
DOUBLE  diff_thr,
enum f_edge1d_sort_mode  sort_mode,
F_DEDGE **  edges,
INT *  edge_num 
)

計測ライン(線分)上からの複数エッジ点の検出

指定した計測ラインに垂直方向に濃度投影を実行して得られた濃度プロファイルから、 複数のエッジ点をサブピクセル精度で検出します。

fie_edge1d_line.png

本関数は、 エッジ検出アルゴリズムの違いにより、 fnFIE_edge1d_line2() のように1次微分データは取得できません。

処理フロー
濃度プロファイルの生成、エッジ検出(サブピクセル精度)、座標変換の各処理には以下の関数が使用されています。

濃度プロファイルの生成fnFIE_edge1d_projection_line()
エッジの検出fnFIE_edge1d_detect_edges_corr()
fnFIE_edge1d_detect_edges_DoG()
座標変換fnFIE_edge1d_trans_coord_line()

本関数では、関数内部で生成される濃度プロファイル内の隣り合う要素の濃度差が1以下の場合は、その部分を平坦であると判定します。 そのため、濃度差が1以下の部分のエッジ点は検出されません。 ただし濃度プロファイルは、微小な濃度変化を吸収するために、 fnFIE_d4i5() にて四捨五入をした後に上記処理を行います。 なお上記の処理は、 fnFIE_edge1d_detect_edges_corr() または fnFIE_edge1d_detect_edges_DoG() での処理となります。

検出されたエッジ点保存配列
本関数では検出されたエッジ点を保存するための配列のメモリ確保の方法を選択することができます。
  • 関数内部での自動確保
  • 関数外部でのユーザが任意に確保
*edges が NULL で初期化されている場合は、 *edges は内部でメモリが自動的に確保されます。 検出されたエッジ個数は、 edge_num を参照してください。 *edges が不要になった後は、 fnOAL_free() をコールしてメモリを解放する必要があります。

*edges が NULL で初期化されていない場合は、本関数内部でメモリ確保しません。 メモリを確保した配列を用意してください。 edge_num に確保したメモリの個数を入力してください。 edge_numfnFIE_edge1d_calc_projection_line_length() で求められる計測ラインの長さ以上のサイズのメモリを確保した配列を用意してください。 ただし、 edge_num はエッジ座標を検出後、検出されたエッジ点個数に上書きされます。 edge_num が0以下の場合は、 F_ERR_INVALID_PARAM が返されます。

引数:
[in] hsrc 入力画像(type:uc8,s16,us16,double / ch:1)
[in] line 計測ライン
fnFIE_edge1d_calc_projection_line_length() で求められる計測ラインの長さが9以上でなければなりません
  • st 始点
  • ed 終点
[in] prj_width 検出片幅(0以上、単位:画素)
  • 0を指定した場合は、計測ライン上のみ有意となる
[in] filter_mode エッジ抽出フィルタの指定
  • F_EDGE1D_DOG (微分方式)DoGフィルタ
  • F_EDGE1D_CORR (テンプレートマッチング方式)相関エッジフィルタ
[in] direct_mode 検出するエッジ方向の指定
  • F_DRK_TO_BRI 暗→明のエッジ
  • F_BRI_TO_DRK 明→暗のエッジ
  • F_DTC_BOTH 両極性
[in] diff_type 濃度差しきい値の種別
  • F_ABSOLUTE_THR 絶対濃度差
  • F_RELATIVE_THR 相対濃度差
[in] diff_thr エッジの最小濃度差しきい値
  • F_ABSOLUTE_THR を指定した場合
    • 画素タイプが F_IMG_UC8 の場合 :[0,255]
    • 画素タイプが F_IMG_S16 または F_IMG_US16 の場合 :[0,65535]
    • 画素タイプが F_IMG_DOUBLE の場合 :[0, 2147483647]
    • 内部で、 fnFIE_d4i5() にて四捨五入される
  • F_RELATIVE_THR を指定した場合:[0,100](%)
    • 生成された濃度プロファイル内の最大値と最小値の差に対する割合
    • 求められたしきい値は、 fnFIE_d4i5() にて四捨五入される
[in] sort_mode 検出されたエッジの保存順を指定
  • F_MAG_SORT 強度順
  • F_POS_SORT 始点からの位置順
[out] edges 検出されたエッジ点保存配列のポインタ
  • x x座標
  • y y座標
  • q 勾配方向
    • 暗→明のエッジ 1
    • 明→暗のエッジ -1
  • mag 強度(0以上)
[in,out] edge_num 検出されたエッジ点個数
入力の場合は、以下の通りに指定する必要があります
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された(計測ラインの長さ不足等)
F_ERR_NODATA 濃度プロファイルに有効領域が存在しない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_edge1d_line2 ( FHANDLE  hsrc,
DSGMT_T  line,
INT  prj_width,
F_EDGE1D_DIFF_FILTER  diff_filter,
INT  arnd,
INT  interval,
enum f_edge1d_edge_direction  direct_mode,
enum f_diff_type  diff_type,
DOUBLE  diff_thr,
enum f_edge1d_sort_mode  sort_mode,
F_DEDGE **  edges,
INT *  edge_num,
INT **  diff,
INT *  diff_len 
)

計測ライン(線分)上からの複数エッジ点の検出

指定した計測ラインに垂直方向に濃度投影を実行して得られた濃度プロファイルから、 複数のエッジ点をサブピクセル精度で検出します。

fie_edge1d_line.png

fnFIE_edge1d_line() とは、エッジの検出アルゴリズムが異なります。 本関数によるエッジ検出アルゴリズムは、 FVXのFvxMultiEdgeと同じです。 ただし、エッジ検出アルゴリズムは前述したものと同じですが、結果が必ずしも一致するわけではありません。

処理フロー
濃度プロファイルの生成、エッジ検出(サブピクセル精度)、座標変換の各処理には以下の関数が使用されています。

濃度プロファイルの生成fnFIE_edge1d_projection_line()
エッジの検出fnFIE_edge1d_detect_edges_diff()
座標変換fnFIE_edge1d_trans_coord_line()

微分値作成方法
本クラスは濃度投影を取得後、微分フィルタパラメータ diff_filter に指定されたフィルタに従って微分データを作成します。 微分フィルタについては、構造体 F_EDGE1D_DIFF_FILTER の説明をご参照ください。

検出されたエッジ点保存配列
本関数では検出されたエッジ点を保存するための配列のメモリ確保の方法を選択することができます。
  • 関数内部での自動確保
  • 関数外部でのユーザが任意に確保
*edges が NULL で初期化されている場合は、 *edges は内部でメモリが自動的に確保されます。 検出されたエッジ個数は、 edge_num を参照してください。 *edges が不要になった後は、 fnOAL_free() をコールしてメモリを解放する必要があります。

*edges が NULL で初期化されていない場合は、本関数内部でメモリ確保しません。 メモリを確保した配列を用意してください。 edge_num に確保したメモリの個数を入力してください。 edge_numfnFIE_edge1d_calc_projection_line_length() で求められる計測ラインの長さ以上のサイズのメモリを確保した配列を用意してください。 ただし、 edge_num はエッジ座標を検出後、検出されたエッジ点個数に上書きされます。 edge_num が0以下の場合は、 F_ERR_INVALID_PARAM が返されます。

1次微分データ保存配列
本関数では1次微分データを保存するための配列のメモリ確保の方法を選択することができます。
  • 関数内部での自動確保
  • 関数外部でのユーザが任意に確保
*diff が NULL で初期化されている場合は、 *diff は内部でメモリが自動的に確保されます。 1次微分データの長さは、 diff_len を参照してください。 *diff が不要になった後は、 fnOAL_free() をコールしてメモリを解放する必要があります。

*diff が NULL で初期化されていない場合は、本関数内部でメモリ確保しません。 メモリを確保した配列を用意してください。 diff_len に確保したメモリの個数を入力してください。 difffnFIE_edge1d_calc_projection_line_length() で求められる計測ラインの長さ以上のサイズのメモリを確保した配列を用意してください。 diff_len が0以下の場合は、 F_ERR_INVALID_PARAM が返されます。

なお1次微分データは、 fnFIE_d4i5() にて四捨五入され整数型として生成され、処理に利用されます。

引数:
[in] hsrc 入力画像(type:uc8,s16,us16,double / ch:1)
[in] line 計測ライン
fnFIE_edge1d_calc_projection_line_length() で求められる計測ラインの長さが arnd * 2 + diff_filter 以上でなければなりません
  • st 始点
  • ed 終点
[in] prj_width 検出片幅(0以上、単位:画素)
  • 0を指定した場合は、計測ライン上のみ有意となる
[in] diff_filter 微分フィルタの指定
  • minus_foot 負側のfoot長さ(1以上)
  • minus_len 負側のlen長さ(0以上)
  • plus_foot 正側のfoot長さ(1以上)
  • plus_len 正側のlen長さ(0以上)
[in] arnd サブピクセル計算に使用する周辺情報の片幅(0以上)
検出した濃度微分データのピーク位置(または、または最初にしきい値を超えた位置)に対して、 ここで指定した画素分の両端の濃度微分データを使用してサブピクセル精度の計算をする
[in] interval エッジ取得間隔(0以上、単位:画素)
エッジ計測に利用された1次微分データ上で、エッジ方向が等しい2つのエッジ間の距離は少なくとも interval 以上となる。 エッジ方向が異なる場合は影響しない。
  • interval が0であれば、連続した座標で同じ方向のエッジが取得されることがある。
  • interval が n≧1 であれば、連続した座標で同じ方向のエッジが取得されることはなく、隣り合うエッジ間の距離は少なくとも n となる。
  • いずれの場合においても、方向が異なるエッジは連続した座標で取得されることがある。
[in] direct_mode 検出するエッジ方向の指定
  • F_DRK_TO_BRI 暗→明のエッジ
  • F_BRI_TO_DRK 明→暗のエッジ
  • F_DTC_BOTH 両極性
[in] diff_type 濃度差しきい値の種別
  • F_ABSOLUTE_THR 絶対濃度差
  • F_RELATIVE_THR 相対濃度差
[in] diff_thr エッジの最小濃度差しきい値
  • F_ABSOLUTE_THR を指定した場合
    • 画素タイプが F_IMG_UC8 の場合 :[0,255]
    • 画素タイプが F_IMG_S16 または F_IMG_US16 の場合 :[0,65535]
    • 画素タイプが F_IMG_DOUBLE の場合 :[0, 2147483647]
    • 内部で、 fnFIE_d4i5() にて四捨五入される
  • F_RELATIVE_THR を指定した場合:[0,100](%)
    • 生成された濃度プロファイル内の最大値と最小値の差に対する割合
    • 求められたしきい値は、 fnFIE_d4i5() にて四捨五入される
[in] sort_mode 検出されたエッジの保存順を指定
  • F_MAG_SORT 強度順
  • F_POS_SORT 始点からの位置順
[out] edges 検出されたエッジ点保存配列のポインタ
  • x x座標
  • y y座標
  • q 勾配方向
    • 暗→明のエッジ 1
    • 明→暗のエッジ -1
  • mag 強度(0以上)
[in,out] edge_num 検出されたエッジ点個数
入力の場合は、以下の通りに指定する必要があります
[out] diff 1次微分データ保存用配列のポインタ
[in,out] diff_len 1次微分データ保存用配列の長さ
入力の場合は、以下の通りに指定する必要があります
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された(計測ラインの長さが不足等)
F_ERR_NODATA 濃度プロファイルに有効領域が存在しない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_edge1d_arc ( FHANDLE  hsrc,
F_ARC  arc,
INT  prj_width,
enum f_edge1d_filter  filter_mode,
enum f_edge1d_edge_direction  direct_mode,
enum f_diff_type  diff_type,
DOUBLE  diff_thr,
enum f_edge1d_sort_mode  sort_mode,
F_DEDGE **  edges,
INT *  edge_num 
)

計測ライン(円弧)上からの複数エッジ点の検出

指定した円弧上にエッジを計測します。 計測ラインに垂直方向に濃度投影を実行して得られた濃度プロファイルから、 複数のエッジ点をサブピクセル精度で検出します。

fie_edge1d_arc.png

計測に用いる円弧は F_ARC にて指定します。詳しいデータ構造については、構造体 F_ARC を参照してください。
本関数は、 エッジ検出アルゴリズムの違いにより、 fnFIE_edge1d_arc2() のように1次微分データは取得できません。
また、円弧の角度を$2\pi$以上に設定した場合、同じ箇所を複数回 計測してしまうため、エッジが重複して検出されてしまいます。そのため、入力値は$2\pi$未満としてください。

処理フロー
濃度プロファイルの生成、エッジ検出(サブピクセル精度)、座標変換の各処理には以下の関数が使用されています。

濃度プロファイルの生成fnFIE_edge1d_projection_arc()
エッジの検出fnFIE_edge1d_detect_edges_corr()
fnFIE_edge1d_detect_edges_DoG()
座標変換fnFIE_edge1d_trans_coord_arc()

本関数では、関数内部で生成される濃度プロファイル内の隣り合う要素の濃度差が1以下の場合は、その部分を平坦であると判定します。 そのため、濃度差が1以下の部分のエッジ点は検出されません。 ただし濃度プロファイルは、微小な濃度変化を吸収するために、 fnFIE_d4i5() にて四捨五入をした後に上記処理を行います。 なお上記の処理は、 fnFIE_edge1d_detect_edges_corr() または fnFIE_edge1d_detect_edges_DoG() での処理となります。

検出されたエッジ点保存配列
本関数では検出されたエッジ点を保存するための配列のメモリ確保の方法を選択することができます。
  • 関数内部での自動確保
  • 関数外部でのユーザが任意に確保
*edges が NULL で初期化されている場合は、 *edges は内部でメモリが自動的に確保されます。 検出されたエッジ個数は、 edge_num を参照してください。 *edges が不要になった後は、 fnOAL_free() をコールしてメモリを解放する必要があります。

*edges が NULL で初期化されていない場合は、本関数内部でメモリ確保しません。 メモリを確保した配列を用意してください。 edge_num に確保したメモリの個数を入力してください。 edge_numfnFIE_edge1d_calc_projection_arc_length() で求められる計測ラインの長さ以上のサイズのメモリを確保した配列を用意してください。 ただし、 edge_num はエッジ座標を検出後、検出されたエッジ点個数に上書きされます。 edge_num が0以下の場合は、 F_ERR_INVALID_PARAM が返されます。

引数:
[in] hsrc 入力画像(type:uc8,s16,us16,double / ch:1)
[in] arc 計測ライン(円弧)
構造体 F_ARC にて指定します
fnFIE_edge1d_calc_projection_arc_length() で求められる計測ラインの長さが9以上でなければなりません
  • x 中心x座標
  • y 中心y座標
  • radius 半径:0 < radius
  • start_angle 開始角:[0, $2\pi$]
  • sweep_angle 円弧の角度 (単位:radian)
    • 時計回り 正
    • 反時計回り 負
[in] prj_width 検出片幅(0以上、単位:画素)
  • 0を指定した場合は、計測ライン上のみ有意となる
[in] filter_mode エッジ抽出フィルタの指定
  • F_EDGE1D_DOG (微分方式)DoGフィルタ
  • F_EDGE1D_CORR (テンプレートマッチング方式)相関エッジフィルタ
[in] direct_mode 検出するエッジ方向の指定
  • F_DRK_TO_BRI 暗→明のエッジ
  • F_BRI_TO_DRK 明→暗のエッジ
  • F_DTC_BOTH 両極性
[in] diff_type 濃度差しきい値の種別
  • F_ABSOLUTE_THR 絶対濃度差
  • F_RELATIVE_THR 相対濃度差
[in] diff_thr エッジの最小濃度差しきい値
  • F_ABSOLUTE_THR を指定した場合
    • 画素タイプが F_IMG_UC8 の場合 :[0,255]
    • 画素タイプが F_IMG_S16 または F_IMG_US16 の場合 :[0,65535]
    • 画素タイプが F_IMG_DOUBLE の場合 :[0, 2147483647]
    • 内部で、 fnFIE_d4i5() にて四捨五入される
  • F_RELATIVE_THR を指定した場合:[0,100](%)
    • 生成された濃度プロファイル内の最大値と最小値の差に対する割合
    • 求められたしきい値は、 fnFIE_d4i5() にて四捨五入される
[in] sort_mode 検出されたエッジの保存順を指定
  • F_MAG_SORT 強度順
  • F_POS_SORT 始点からの位置順
[out] edges 検出されたエッジ点保存配列のポインタ
  • x x座標
  • y y座標
  • q 勾配方向
    • 暗→明のエッジ 1
    • 明→暗のエッジ -1
  • mag 強度(0以上)
[in,out] edge_num 検出されたエッジ点個数
入力の場合は、以下の通りに指定する必要があります
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された(計測ラインの長さ不足等)
F_ERR_NODATA 濃度プロファイルに有効領域が存在しない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_edge1d_arc2 ( FHANDLE  hsrc,
F_ARC  arc,
INT  prj_width,
F_EDGE1D_DIFF_FILTER  diff_filter,
INT  arnd,
INT  interval,
enum f_edge1d_edge_direction  direct_mode,
enum f_diff_type  diff_type,
DOUBLE  diff_thr,
enum f_edge1d_sort_mode  sort_mode,
F_DEDGE **  edges,
INT *  edge_num,
INT **  diff,
INT *  diff_len 
)

計測ライン(円弧)上からの複数エッジ点の検出

指定した円弧上にエッジを計測します。 計測ラインに垂直方向に濃度投影を実行して得られた濃度プロファイルから、 複数のエッジ点をサブピクセル精度で検出します。

fie_edge1d_arc.png

計測に用いる円弧は F_ARC にて指定します。詳しいデータ構造については、構造体 F_ARC を参照してください。
円弧の角度を$2\pi$以上に設定した場合、同じ箇所を複数回 計測してしまうため、エッジが重複して検出されてしまいます。そのため、入力値は$2\pi$未満としてください。

fnFIE_edge1d_line() とは、エッジの検出アルゴリズムが異なります。 本関数によるエッジ検出アルゴリズムは、 旧1次元エッジ検出ライブラリと同じとなります。 旧ライブラリとの互換性のために、本関数は作成されています。 ただし、エッジ検出アルゴリズムは旧ライブラリと同じですが、結果が必ずしも一致するわけではありません。

処理フロー
濃度プロファイルの生成、エッジ検出(サブピクセル精度)、座標変換の各処理には以下の関数が使用されています。

濃度プロファイルの生成fnFIE_edge1d_projection_arc()
エッジの検出fnFIE_edge1d_detect_edges_diff()
座標変換fnFIE_edge1d_trans_coord_arc()

検出されたエッジ点保存配列
本関数では検出されたエッジ点を保存するための配列のメモリ確保の方法を選択することができます。
  • 関数内部での自動確保
  • 関数外部でのユーザが任意に確保
*edges が NULL で初期化されている場合は、 *edges は内部でメモリが自動的に確保されます。 検出されたエッジ個数は、 edge_num を参照してください。 *edges が不要になった後は、 fnOAL_free() をコールしてメモリを解放する必要があります。

*edges が NULL で初期化されていない場合は、本関数内部でメモリ確保しません。 メモリを確保した配列を用意してください。 edge_num に確保したメモリの個数を入力してください。 edge_numfnFIE_edge1d_calc_projection_arc_length() で求められる計測ラインの長さ以上のサイズのメモリを確保した配列を用意してください。 ただし、 edge_num はエッジ座標を検出後、検出されたエッジ点個数に上書きされます。 edge_num が0以下の場合は、 F_ERR_INVALID_PARAM が返されます。

1次微分データ保存配列
本関数では1次微分データを保存するための配列のメモリ確保の方法を選択することができます。
  • 関数内部での自動確保
  • 関数外部でのユーザが任意に確保
*diff が NULL で初期化されている場合は、 *diff は内部でメモリが自動的に確保されます。 1次微分データの長さは、 diff_len を参照してください。 *diff が不要になった後は、 fnOAL_free() をコールしてメモリを解放する必要があります。

*diff が NULL で初期化されていない場合は、本関数内部でメモリ確保しません。 メモリを確保した配列を用意してください。 diff_len に確保したメモリの個数を入力してください。 diff_lenfnFIE_edge1d_calc_projection_arc_length() で求められる計測ラインの長さ以上のサイズのメモリを確保した配列を用意してください。 diff_len が0以下の場合は、 F_ERR_INVALID_PARAM が返されます。

なお1次微分データは、 fnFIE_d4i5() にて四捨五入され整数型として生成され、処理に利用されます。

引数:
[in] hsrc 入力画像(type:uc8,s16,us16,double / ch:1)
[in] arc 計測ライン(円弧)
構造体 F_ARC にて指定します
fnFIE_edge1d_calc_projection_arc_length() で求められる計測ラインの長さが arnd * 2 + diff_filter 以上でなければなりません
  • x 中心x座標
  • y 中心y座標
  • radius 半径:0 < radius
  • start_angle 開始角:[0, $2\pi$]
  • sweep_angle 円弧の角度 (単位:radian)
    • 時計回り 正
    • 反時計回り 負
[in] prj_width 検出片幅(0以上、単位:画素)
  • 0を指定した場合は、計測ライン上のみ有意となる
[in] diff_filter 微分フィルタの指定
  • minus_foot 負側のfoot長さ(1以上)
  • minus_len 負側のlen長さ(0以上)
  • plus_foot 正側のfoot長さ(1以上)
  • plus_len 正側のlen長さ(0以上)
[in] arnd サブピクセル計算に使用する周辺情報の片幅(0以上)
検出した濃度微分データのピーク位置(または、または最初にしきい値を超えた位置)に対して、 ここで指定した画素分の両端の濃度微分データを使用してサブピクセル精度の計算をする
[in] interval エッジ取得間隔(0以上、単位:画素)
エッジ計測に利用された1次微分データ上で、エッジ方向が等しい2つのエッジ間の距離は少なくとも interval 以上となる。 エッジ方向が異なる場合は影響しない。
  • interval が0であれば、連続した座標で同じ方向のエッジが取得されることがある。
  • interval が n≧1 であれば、連続した座標で同じ方向のエッジが取得されることはなく、隣り合うエッジ間の距離は少なくとも n となる。
  • いずれの場合においても、方向が異なるエッジは連続した座標で取得されることがある。
[in] direct_mode 検出するエッジ方向の指定
  • F_DRK_TO_BRI 暗→明のエッジ
  • F_BRI_TO_DRK 明→暗のエッジ
  • F_DTC_BOTH 両極性
[in] diff_type 濃度差しきい値の種別
  • F_ABSOLUTE_THR 絶対濃度差
  • F_RELATIVE_THR 相対濃度差
[in] diff_thr エッジの最小濃度差しきい値
  • F_ABSOLUTE_THR を指定した場合
    • 画素タイプが F_IMG_UC8 の場合 :[0,255]
    • 画素タイプが F_IMG_S16 または F_IMG_US16 の場合 :[0,65535]
    • 画素タイプが F_IMG_DOUBLE の場合 :[0, 2147483647]
    • 内部で、 fnFIE_d4i5() にて四捨五入される
  • F_RELATIVE_THR を指定した場合:[0,100](%)
    • 生成された濃度プロファイル内の最大値と最小値の差に対する割合
    • 求められたしきい値は、 fnFIE_d4i5() にて四捨五入される
[in] sort_mode 検出されたエッジの保存順を指定
  • F_MAG_SORT 強度順
  • F_POS_SORT 始点からの位置順
[out] edges 検出されたエッジ点保存配列のポインタ
  • x x座標
  • y y座標
  • q 勾配方向
    • 暗→明のエッジ 1
    • 明→暗のエッジ -1
  • mag 強度(0以上)
[in,out] edge_num 検出されたエッジ点個数
入力の場合は、以下の通りに指定する必要があります
[out] diff 1次微分データ保存用配列のポインタ
[in,out] diff_len 1次微分データ保存用配列の長さ
入力の場合は、以下の通りに指定する必要があります
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された(計測ラインの長さ不足等)
F_ERR_NODATA 濃度プロファイルに有効領域が存在しない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_edge1d_radial ( FHANDLE  hsrc,
DPNT_T  center,
INT  start_radius,
INT  range_radius,
DOUBLE  start_angle,
DOUBLE  range_angle,
INT  line_num,
enum f_edge1d_projection_mode  prj_mode,
INT  prj_width,
enum f_edge1d_filter  filter_mode,
enum f_edge1d_edge_direction  direct_mode,
enum f_diff_type  diff_type,
DOUBLE  diff_thr,
enum f_edge1d_sort_mode  detect_mode,
F_DEDGE **  edges,
INT *  edge_num 
)

放射状(収束or発散)方向エッジ検出

指定した円の中心を基準に開始半径から処理範囲半径まで放射状にエッジを計測します。 処理範囲半径が正の値の場合は、中心から外向きに計測し、負の値の場合は、円周上から内向きに計測を行います。 開始角度は自由に設定することが可能です。検出ラインの間隔は、処理範囲となる角度を(検出ライン本数-1)で割ったものとします。
開始半径と処理範囲半径の合計値が0以上でない場合はエラーとします。( ( start_radius + range_radius ) >= 0 )

各計測ラインの出力エッジ点は1点とします。出力するエッジ点はdetect_modeにより、エッジ強度が最大の点、もしくは開始半径に一番近い点が選択可能です。

fie_edge1d_radial.png

range_radiusが正でdetect_modeがF_POS_SORTの場合

濃度投影方法
濃度プロファイルは矩形型と扇型の二種類を選択することが可能です。それぞれの特徴は下記の通りです。
  • 矩形型 :適切な投影片幅を設定することでノイズに強くなります。半径が小さい対象に大きな投影片幅を与えた場合はエッジ点が中心側へずれる場合があります。 投影片幅と検出ライン本数が小さい場合は比較的高速に動作します。
  • 扇型 :円状の対象のエッジを検出する場合は、矩形型より正確な投影が可能です。中心側での投影範囲が小さくなる場合があり、その際はノイズに弱くなります。 投影片幅と検出ライン本数が大きい場合は比較的高速に動作します。
fie_edge1d_radial_projection_box.png

矩形型の濃度投影

fie_edge1d_radial_projection.png

扇型の濃度投影

検出されたエッジ点保存配列
本関数では検出されたエッジ点を保存するための配列のメモリ確保の方法を選択することができます。
  • 関数内部での自動確保
  • 関数外部でのユーザが任意に確保
*edges が NULL で初期化されている場合は、 *edges は内部でメモリが自動的に確保されます。 検出されたエッジ個数は、 edge_num を参照してください。 *edges が不要になった後は、 fnOAL_free() をコールしてメモリを解放する必要があります。

*edges が NULL で初期化されていない場合は、本関数内部でメモリ確保しません。 メモリを確保した配列を用意してください。 edge_num に確保したメモリの個数を入力してください。 edge_num は 計測ライン本数(line_num)以上のサイズのメモリを確保した配列を用意してください。 ただし、 edge_num はエッジ座標を検出後、検出されたエッジ点個数に上書きされます。 edge_num が0以下の場合は、 F_ERR_INVALID_PARAM が返されます。

引数:
[in] hsrc 入力画像(type:uc8,us16,double / ch:1)
[in] center 計測円の中心座標
[in] start_radius 検出ラインの開始半径(0以上)
[in] range_radius 検出ラインの処理範囲半径
[in] start_angle 開始角度(radian)
[in] range_angle 処理範囲角度(radian)
[in] line_num 検出ライン本数(1以上)
[in] prj_mode 濃度投影方法の指定
  • F_PROJECTION_BOX 矩形型濃度投影
  • F_PROJECTION_FAN 扇型濃度投影
[in] prj_width 濃度投影片幅(0以上、単位:画素)
  • 0を指定した場合は、計測ライン上のみ有意となる
[in] filter_mode エッジ抽出フィルタの指定
  • F_EDGE1D_DOG (微分方式)DoGフィルタ
  • F_EDGE1D_CORR (テンプレートマッチング方式)相関エッジフィルタ
[in] direct_mode 検出するエッジ方向の指定
  • F_DRK_TO_BRI 暗→明のエッジ
  • F_BRI_TO_DRK 明→暗のエッジ
  • F_DTC_BOTH 両極性
[in] diff_type 濃度差しきい値の種別
  • F_ABSOLUTE_THR 絶対濃度差
  • F_RELATIVE_THR 相対濃度差
[in] diff_thr エッジの最小濃度差しきい値
  • F_ABSOLUTE_THR を指定した場合
    • 画素タイプが F_IMG_UC8 の場合 :[0,255]
    • 画素タイプが F_IMG_US16 の場合 :[0,65535]
    • 画素タイプが F_IMG_DOUBLE の場合 :[0, 2147483647]
    • 内部で、 fnFIE_d4i5() にて四捨五入される
  • F_RELATIVE_THR を指定した場合:[0,100](%)
    • 生成された濃度プロファイル内の最大値と最小値の差に対する割合
    • 求められたしきい値は、 fnFIE_d4i5() にて四捨五入される
[in] detect_mode 各計測ラインで検出されたエッジ点の出力方法を指定
  • F_MAG_SORT エッジ強度が最大となる点
  • F_POS_SORT 開始半径に一番近い点
[out] edges 検出されたエッジ点保存配列のポインタ
開始角度から順に格納されます
  • x x座標
  • y y座標
  • q 勾配方向
    • 暗→明のエッジ 1
    • 明→暗のエッジ -1
  • mag 強度(0以上)
[in,out] edge_num 検出されたエッジ点個数
入力の場合は、以下の通りに指定する必要があります
  • edges のメモリを内部確保:指定なし
  • edges のメモリを外部確保:確保したメモリ数を入力
    • edge_num >= 計測ライン本数(line_num)
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された(計測ラインの長さが不足等)
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー


Documentation copyright © 2009-2024 FAST Corporation.
Generated on Fri Aug 9 16:38:47 2024 for FIEライブラリ by doxygen 1.5.6-FASTSP-p2