データ構造 | |
struct | F_EDGE_SOBEL_PARAMS |
Sobelエッジ用パラメータ構造体 [詳細] | |
struct | F_EDGE_CORR_MAX_PARAMS |
強度上限付相関エッジ用パラメータ構造体 [詳細] | |
struct | F_EDGE_SOBEL_MAX_PARAMS |
強度上限付Sobelエッジ用パラメータ構造体 [詳細] | |
struct | F_EDGE_GROOVE_PARAMS |
細線エッジ用パラメータ構造体 [詳細] | |
struct | F_EDGE |
勾配方向、強度付エッジ点構造体(整数型) [詳細] | |
struct | F_DEDGE |
勾配方向、強度付エッジ点構造体(浮動小数点型) [詳細] | |
struct | F_EDGE_CORR_PARAMS |
相関エッジ用パラメータ構造体 [詳細] | |
マクロ定義 | |
#define | F_EDGE_FEAT_NONE 0x00000000 |
エッジ勾配方向、強度保持指定フラグ エッジの勾配方向、強度供に取得しない | |
#define | F_EDGE_FEAT_MAG_SUM 0x00000001 |
エッジ勾配方向、強度保持指定フラグ エッジの強度をX方向微分とY方向微分の絶対値和として取得する | |
#define | F_EDGE_FEAT_MAG_SQRT 0x00000002 |
エッジ勾配方向、強度保持指定フラグ エッジの強度をX方向微分とY方向微分のユークリッド距離として取得する | |
#define | F_EDGE_FEAT_DIRECT 0x00000004 |
エッジ勾配方向、強度保持指定フラグ エッジの勾配方向を取得する | |
関数 | |
INT FVALGAPI | fnFIE_edge_canny (FHANDLE hImgSrc, FHANDLE hImgOut, INT iTSwitch, DOUBLE dTHigh, DOUBLE dTLow, DOUBLE dSigma, UINT uiMinLen) |
Canny 法によるエッジ検出 | |
INT FVALGAPI | fnFIE_nms_canny (FHANDLE hMagX, FHANDLE hMagY, FHANDLE hMag, DOUBLE dTLow, DOUBLE dTHigh, USHORT *ushpTLow, USHORT *ushpTHigh) |
非極大値の抑制(Canny 法によるエッジ検出で利用) | |
INT FVALGAPI | fnFIE_nms (FHANDLE hMagX, FHANDLE hMagY, FHANDLE hMag, DOUBLE dThresh) |
非極大値の抑制(エッジ勾配を利用) | |
INT FVALGAPI | fnFIE_nms_simple (FHANDLE hSrc, FHANDLE hTar, INT iBrdMod, DOUBLE dBrdVal) |
非極大値の抑制 単純 | |
INT FVALGAPI | fnFIE_edge_binary_boundary (FHANDLE hsrc, INT smooth_size, DPNT_T offset, F_DEDGE **edges, INT *edge_num) |
領域の境界点列を利用したエッジ検出 | |
INT FVALGAPI | fnFIE_edge_corr (FHANDLE hsrc, FHANDLE hmag, const F_EDGE_CORR_PARAMS *params, UINT feat_mode, INT border_mode, PNT_T offset, F_EDGE **edges, INT *edge_num) |
相関エッジフィルタを利用したエッジ検出 | |
INT FVALGAPI | fnFIE_edge_corr_subpix (FHANDLE hsrc, FHANDLE hmag, const F_EDGE_CORR_PARAMS *params, UINT feat_mode, INT border_mode, DPNT_T offset, F_DEDGE **edges, INT *edge_num) |
相関エッジフィルタを利用したエッジ検出(サブピクセル精度) | |
INT FVALGAPI | fnFIE_edge_sobel (FHANDLE hsrc, FHANDLE hmag, const F_EDGE_SOBEL_PARAMS *params, UINT feat_mode, INT border_mode, PNT_T offset, F_EDGE **edges, INT *edge_num) |
ソーベルフィルタを利用したエッジ検出 | |
INT FVALGAPI | fnFIE_edge_sobel_subpix (FHANDLE hsrc, FHANDLE hmag, const F_EDGE_SOBEL_PARAMS *params, UINT feat_mode, INT border_mode, DPNT_T offset, F_DEDGE **edges, INT *edge_num) |
ソーベルフィルタを利用したエッジ検出(サブピクセル精度) | |
INT FVALGAPI | fnFIE_img_get_points_bin (const FHANDLE hsrc, INT color, INT max_pnt_num, PNT_T *pnts, INT *pnt_num) |
2値画像からの点データ取得 | |
INT FVALGAPI | fnFIE_img_get_points_gray (const FHANDLE hsrc, DOUBLE tlow, DOUBLE thigh, INT max_pnt_num, PNT_T *pnts, INT *pnt_num) |
濃淡画像からの点データ列取得 | |
INT FVALGAPI | fnFIE_nms_dir (FHANDLE hmagx, FHANDLE hmagy, FHANDLE hthin, DOUBLE thresh) |
非極大値の抑制(エッジ勾配方向を利用) |
INT FVALGAPI fnFIE_edge_canny | ( | FHANDLE | hImgSrc, | |
FHANDLE | hImgOut, | |||
INT | iTSwitch, | |||
DOUBLE | dTHigh, | |||
DOUBLE | dTLow, | |||
DOUBLE | dSigma, | |||
UINT | uiMinLen | |||
) |
Canny 法によるエッジ検出
Canny 法によるエッジ検出を行います。 Canny 法によるエッジ検出は、望ましい評価基準として、以下の3つの点を考慮しています。
本関数では、ヒステリシス特性で利用される2つの閾値は、2つの異なるモードで与えることがきます。 1つは、両方の閾値を 1.0 より小さく与えることです。 例えば、 dTLow = 0.2 、 dTHigh = 0.7 として与えた場合、 dTLow よって関数内部で計算された閾値より小さいエッジ勾配強度が、全体の画素の 20% であることを示します。 さらに、 70% の画素は、エッジ勾配強度が dTHigh によって計算された閾値より小さいことを示します。 もう一方のモードは、直接、取得したいエッジ勾配強度の値を2つの閾値で指定します。 指定する閾値は、 2^16 - 1 以下の値で指定してください。
[in] | hImgSrc | 入力画像 ( type: uc8 ) |
[out] | hImgOut | 出力画像 ( type: uc8 ) |
[in] | iTSwitch | 閾値のタイプ指定
|
[in] | dTLow | 閾値の下限 |
[in] | dTHigh | 閾値の上限
|
[in] | dSigma | ガウシアンマスクのσ |
[in] | uiMinLen | エッジの最小の長さ この値より小さい孤立したエッジはノイズと判定して削除されます |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された
| |
F_ERR_INVALID_IMAGE | 不正な画像が渡された
| |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_nms_canny | ( | FHANDLE | hMagX, | |
FHANDLE | hMagY, | |||
FHANDLE | hMag, | |||
DOUBLE | dTLow, | |||
DOUBLE | dTHigh, | |||
USHORT * | ushpTLow, | |||
USHORT * | ushpTHigh | |||
) |
非極大値の抑制(Canny 法によるエッジ検出で利用)
非極大抑制は、画像に対して1次微分を施した後に実行されます。 注目画素の勾配を選択させた2つの隣接した画素の勾配と比較します。 注目画素の勾配が隣接した画素の勾配より大きかった場合、 局所的な最大値となり勾配強度は保持されて後の処理に利用されます。 そうでない場合は、0が設定されます。
非極大抑制は、細線化のような効果がありますが、勾配方向を考慮しているため 処理結果は必ずしも1画素の幅の線になるとは限りません。
本関数では、出力画像の周囲1画素は0になります。 また、 hMagX と hMagY で与えられたx方向とy方向のエッジ勾配強度は、 互いに絶対値演算が計算されて、エッジ勾配強度として処理に利用されます。
入力パラメータの dTLow と dTHigh は 0.0〜1.0 の範囲で指定してください。 これらのパラメータは、計算時に使用される閾値で画素の割合を表しています。 つまり、すべての画素と特徴量が閾値より小さい画素との割合を表しています。 例えば、 dTHigh=0.7 が与えられた場合、エッジ勾配強度が dTHigh から計算される上限閾値 より小さな値の画素は、画像全体の 70% であることを示します。 また、 dTLow=0.2 が与えられた場合、エッジ勾配強度が dTLow から計算される下限閾値 より小さな値の画素は、画像全体の 20% であることを示します。 dTLow 、 dTHigh が共に0.0の場合は、デフォルトの dTHight=0.7 、 dTLow=0.35 が与えられます。
入力画像、出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hMagX | X方向のエッジ勾配強度画像 ( type: s16 ) |
[in] | hMagY | Y方向のエッジ勾配強度画像 ( type: s16 ) |
[out] | hMag | エッジ勾配強度画像 (type: us16) |
[in] | dTLow | ピクセル数の下限方向の割合を決定するための閾値 |
[in] | dTHigh | ピクセル数の上限方向の割合を決定するための閾値
|
[out] | ushpTLow | dTLow から得られた下限閾値 |
[out] | ushpTHigh | dTHigh から得られた上限閾値 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された
| |
F_ERR_INVALID_IMAGE | 不正な画像が渡された
| |
F_ERR_NOMEMORY | バッファーメモリ配分失敗 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_nms | ( | FHANDLE | hMagX, | |
FHANDLE | hMagY, | |||
FHANDLE | hMag, | |||
DOUBLE | dThresh | |||
) |
非極大値の抑制(エッジ勾配を利用)
非極大抑制は、画像に対して1次微分を施した後に実行されます。 注目画素の勾配を、勾配方向に隣接した2つの画素の勾配と比較します。 注目画素の勾配が隣接した画素の勾配より大きかった場合、 局所的な最大値となり勾配強度は保持されて後の処理に利用されます。 そうでない場合は、0が設定されます。
非極大抑制は、細線化のような効果があります。 しかしながら、勾配方向を考慮しており、処理結果は必ずしも1画素の幅の線になるとは限りません。
なお本関数では、出力画像の周囲1画素は0になります。 また、 hMagX と hMagY で与えられたx方向とy方向のエッジ勾配強度は、 互いに絶対値演算がなされて、エッジ勾配強度として処理に利用されます。
dThresh は勾配の非常に小さい値を取り除くために利用されます。 1以上の値を与えてください。
[in] | hMagX | X方向のエッジ勾配強度画像 (type: s16, double ) |
[in] | hMagY | Y方向のエッジ勾配強度画像 (type: s16, double ) |
[out] | hMag | エッジ勾配強度画像 (type: us16, double )
|
[in] | dThresh | 非常に小さい勾配を取り除くための閾値 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | dThresh < 0 | |
F_ERR_INVALID_IMAGE | 各画像のサイズが違う、不正な画像が渡された 画像サイズの横縦いずれかが3以下, 或いは (2^16 - 1) 以上 | |
F_ERR_NOMEMORY | バッファーメモリ配分失敗 | |
F_ERR_UNKNOWN | 原因不明なエラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_nms_simple | ( | FHANDLE | hSrc, | |
FHANDLE | hTar, | |||
INT | iBrdMod, | |||
DOUBLE | dBrdVal | |||
) |
非極大値の抑制 単純
3x3の領域中、注目画素が周囲の画素よりも小さかったら濃度を零にします。等しかったり大きかったら何もしません。 通常のNMSは線の接続性を見るため、それよりも多めに線を分断します。 ボーダー処理モード iBrdMod に F_BORDER_NONE 指定した場合は、境界上の画素の濃度値は0になります。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (uc8, s16, us16, double) |
[out] | hTar | 出力画像 (uc8, s16, us16, double) |
[in] | iBrdMod | ボーダー処理モード
|
[in] | dBrdVal | ボーダー濃度値 iBrdMod がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なボーダー処理モードが渡された | |
F_ERR_INVALID_IMAGE | 各画像のサイズが違う、不正な画像が渡された | |
F_ERROR_NOMEMORY | メモリー不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_edge_binary_boundary | ( | FHANDLE | hsrc, | |
INT | smooth_size, | |||
DPNT_T | offset, | |||
F_DEDGE ** | edges, | |||
INT * | edge_num | |||
) |
領域の境界点列を利用したエッジ検出
サブピクセル精度で、領域の境界点列を利用してエッジを検出します。
本関数はリージョンや2値画像からFPMに使用できるエッジを検出するために使用できます。 fnFIE_fpm_import_alloc() や fnFIE_fpm_feature_import_alloc() に検出されたエッジを入力して使用してください。
入力オブジェクト hsrc には以下の2つのオブジェクトのうち、どちらかを使用できます。
[in] | hsrc | 入力FIEオブジェクト
|
[in] | smooth_size | 移動平均フィルタサイズ |
[in] | offset | オフセット量 |
[out] | edges | 取得したエッジ |
[in,out] | edge_num | 取得したエッジ数 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_OBJECT | 不正なオブジェクトが渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_edge_corr | ( | FHANDLE | hsrc, | |
FHANDLE | hmag, | |||
const F_EDGE_CORR_PARAMS * | params, | |||
UINT | feat_mode, | |||
INT | border_mode, | |||
PNT_T | offset, | |||
F_EDGE ** | edges, | |||
INT * | edge_num | |||
) |
相関エッジフィルタを利用したエッジ検出
相関エッジフィルタを利用してエッジを検出します。 エッジ情報を細線化後、特徴量を抽出します。 ノイズやボケ、シェーディングなどの悪条件に比較的強い傾向がありますが、 ソーベルより処理時間が掛かり、パラメータ調整にも熟練が必要です。
なお、本関数ではエッジをサブピクセル精度で取得はしません。 サブピクセル精度でエッジを取得したい場合は、 fnFIE_edge_corr_subpix() を使用してください。
名前 | 推奨値 | 値域 |
---|---|---|
相関エッジフィルタの幅( width ) | 13 | 3 ≦ width ≦ 255の奇数, height ≦ width |
相関エッジフィルタの高さ( height ) | 5 | 1 ≦ height ≦ 255の奇数, height ≦ width |
シグモイド係数( sigmoid_k ) | 1.0 | 0 < sigmoid_k |
分散しきい値( var_threshold ) | UC8型の場合は25 | 0 < var_threshold ≦上限値。上限値は画像型に依存 |
強度しきい値( mag_threshold ) | 160 | 0 ≦ mag_threshold ≦ 255 |
非極大抑制のフィルタ片幅( nms_length ) | 6 (= ( width - 1) / 2) | 1 ≦ nms_length |
[in] | hsrc | 入力画像(type:uc8, s16, us16, double / ch:1) |
[out] | hmag | エッジ強度画像(type:us16 / ch:1) |
[in] | params | エッジ検出のための各種パラメータ |
[in] | feat_mode | 勾配方向、強度付きエッジ点構造体に保持するデータを指定するモード |
[in] | border_mode | ボーダーモード
|
[in] | offset | オフセット量 |
[out] | edges | 取得したエッジ |
[out] | edge_num | 取得したエッジ数 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 処理結果画像 |
// エラー処理は省略しているので注意して下さい #include "fie.h" #include "oal_aloc.h" INT main() { INT i; // 入力画像 FHANDLE hsrc = NULL; // パラメータ F_EDGE_CORR_PARAMS params; UINT feat_mode; INT border_mode; PNT_T offset; // 取得されるエッジ F_EDGE * pedges = NULL; // 取得されるエッジの数 INT edge_num; // FIEライブラリの初期化処理 fnFIE_setup(); // 入力画像をファイルから読み込む fnFIE_load_bmp("src_img.bmp", &hsrc, F_COLOR_IMG_TYPE_UC8); // パラメータの設定 params.width = 5; // 相関エッジフィルタの幅 params.height= 3; // 相関エッジフィルタの高さ params.sigmoid_k = 1.0; // シグモイド係数 params.var_threshold = 25; // 分散しきい値 params.mag_threshold = 100; // 強度しきい値 params.nms_length = 1; // 非極大抑制のフィルタ片幅 feat_mode = F_EDGE_FEAT_NONE; // 勾配方向、強度データ保持の指定 border_mode = F_BORDER_NONE; // ボーダー処理 offset.x = offset.y = 0; // オフセット量 // 相関エッジフィルタを利用したエッジ検出の実行 fnFIE_edge_corr(hsrc, NULL, ¶ms, feat_mode, border_mode, offset, &pedges, &edge_num); // 取得したエッジ点を入力画像上にプロットし、ファイルへ保存する for(i=0; i<edge_num; i++){ fnFIE_img_set_dens(hsrc, 0, pedges[i].x, pedges[i].y, 255); } fnFIE_save_bmp("dst_img.bmp", hsrc); // 入力画像の解放 fnFIE_free_object(hsrc); // 取得したエッジは fnOAL_free関数により解放する fnOAL_free(pedges); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_edge_corr_subpix | ( | FHANDLE | hsrc, | |
FHANDLE | hmag, | |||
const F_EDGE_CORR_PARAMS * | params, | |||
UINT | feat_mode, | |||
INT | border_mode, | |||
DPNT_T | offset, | |||
F_DEDGE ** | edges, | |||
INT * | edge_num | |||
) |
相関エッジフィルタを利用したエッジ検出(サブピクセル精度)
サブピクセル精度で、相関エッジフィルタを利用してエッジを検出します。 エッジ情報を細線化後、特徴量を抽出します。 ノイズやボケ、シェーディングなどの悪条件に比較的強い傾向がありますが、 ソーベルより処理時間が掛かり、パラメータ調整にも熟練が必要です。
名前 | 推奨値 | 値域 |
---|---|---|
相関エッジフィルタの幅( width ) | 13 | 3 ≦ width ≦ 255の奇数, height ≦ width |
相関エッジフィルタの高さ( height ) | 5 | 1 ≦ height ≦ 255の奇数, height ≦ width |
シグモイド係数( sigmoid_k ) | 1.0 | 0 < sigmoid_k |
分散しきい値( var_threshold ) | UC8型の場合は25 | 0 < var_threshold ≦上限値。上限値は画像型に依存 |
強度しきい値( mag_threshold ) | 160 | 0 ≦ mag_threshold ≦ 255 |
非極大抑制のフィルタ片幅( nms_length ) | 6 (= ( width - 1) / 2) | 1 ≦ nms_length |
[in] | hsrc | 入力画像(type:uc8, s16, us16, double / ch:1) |
[out] | hmag | エッジ強度画像(type:us16 / ch:1) |
[in] | params | エッジ検出のための各種パラメータ |
[in] | feat_mode | 勾配方向、強度付きエッジ点構造体に保持するデータを指定するモード |
[in] | border_mode | ボーダーモード
|
[in] | offset | オフセット量 |
[out] | edges | 取得したエッジ |
[out] | edge_num | 取得したエッジ数 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 処理結果画像 |
// エラー処理は省略しているので注意して下さい #include "fie.h" #include "oal_aloc.h" INT main() { INT i; // 入力画像 FHANDLE hsrc = NULL; // パラメータ F_EDGE_CORR_PARAMS params; UINT feat_mode; INT border_mode; DPNT_T offset; // 取得されるエッジ F_DEDGE * pedges = NULL; // 取得されるエッジの数 INT edge_num; // FIEライブラリの初期化処理 fnFIE_setup(); // 入力画像をファイルから読み込む fnFIE_load_bmp("src_img.bmp", &hsrc, F_COLOR_IMG_TYPE_UC8); // パラメータの設定 params.width = 5; // 相関エッジフィルタの幅 params.height= 3; // 相関エッジフィルタの高さ params.sigmoid_k = 1.0; // シグモイド係数 params.var_threshold = 25; // 分散しきい値 params.mag_threshold = 100; // 強度しきい値 params.nms_length = 1; // 非極大抑制のフィルタ片幅 feat_mode = F_EDGE_FEAT_NONE; // 勾配方向、強度データの保持の指定 border_mode = F_BORDER_NONE; // ボーダー処理 offset.x = offset.y = 0.0; // オフセット量 // 相関エッジフィルタを利用したエッジ検出(サブピクセル精度)の実行 fnFIE_edge_corr_subpix(hsrc, NULL, ¶ms, feat_mode, border_mode, offset, &pedges, &edge_num); // 取得したエッジ点を入力画像上にプロットし、ファイルへ保存する for(i=0; i<edge_num; i++){ DPNT_T pnt; DOUBLE prot_val = 255.0; pnt.x = pedges[i].x; pnt.y = pedges[i].y; fnFIE_draw_point(hsrc, &prot_val, pnt); } fnFIE_save_bmp("dst_img.bmp", hsrc); // 入力画像の解放 fnFIE_free_object(hsrc); // 取得したエッジは fnOAL_free関数により解放する fnOAL_free(pedges); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_edge_sobel | ( | FHANDLE | hsrc, | |
FHANDLE | hmag, | |||
const F_EDGE_SOBEL_PARAMS * | params, | |||
UINT | feat_mode, | |||
INT | border_mode, | |||
PNT_T | offset, | |||
F_EDGE ** | edges, | |||
INT * | edge_num | |||
) |
ソーベルフィルタを利用したエッジ検出
ソーベルフィルタ( fnFIE_sobel() )を利用してエッジを検出します。 エッジ情報を細線化後、特徴量を抽出します。 ソーベルフィルタを利用したエッジ検出は、直感的にわかりやすいパラメータで高速で処理が可能ですが、 環境変化に弱く、対象物の焦点ずれ等によるボケが生じた場合に精度の安定性が低い傾向があります。
なお、本関数ではエッジをサブピクセル精度で取得はしません。 サブピクセル精度でエッジを取得したい場合は、 fnFIE_edge_sobel_subpix() を使用してください。
[-1][0][1] [-2][0][2] [-1][0][1]
[-1][-2][-1] [ 0][ 0][ 0] [ 1][ 2][ 1]
入力画像に対して、x方向、y方向のソーベルフィルタを施した微分画像をそれぞれ生成し、その後の処理をします。
[in] | hsrc | 入力画像(type:uc8 / ch:1) |
[out] | hmag | エッジ強度画像(type:us16 / ch:1) |
[in] | params | エッジ検出のための各種パラメータ |
[in] | feat_mode | 勾配方向、強度付きエッジ点構造体に保持するデータを指定するモード |
[in] | border_mode | ボーダーモード
|
[in] | offset | オフセット量 |
[out] | edges | 取得したエッジ |
[out] | edge_num | 取得したエッジ数 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 処理結果画像 |
// エラー処理は省略しているので注意して下さい #include "fie.h" #include "oal_aloc.h" INT main() { INT i; // 入力画像 FHANDLE hsrc = NULL; // パラメータ F_EDGE_SOBEL_PARAMS params; UINT feat_mode; INT border_mode; PNT_T offset; // 取得されるエッジ F_EDGE * pedges = NULL; // 取得されるエッジの数 INT edge_num; // FIEライブラリの初期化処理 fnFIE_setup(); // 入力画像をファイルから読み込む fnFIE_load_bmp("src_img.bmp", &hsrc, F_COLOR_IMG_TYPE_UC8); // パラメータの設定 params.mag_threshold = 40; // 強度しきい値 params.nms_length = 1; // 非極大抑制のフィルタ片幅 feat_mode = F_EDGE_FEAT_NONE; // 勾配方向、強度データ保持の指定 border_mode = F_BORDER_NONE; // ボーダー処理 offset.x = offset.y = 0; // オフセット量 // ソーベルフィルタを利用したエッジ検出の実行 fnFIE_edge_sobel(hsrc, NULL, ¶ms, feat_mode, border_mode, offset, &pedges, &edge_num); // 取得したエッジ点を入力画像上にプロットし、ファイルへ保存する for(i=0; i<edge_num; i++){ fnFIE_img_set_dens(hsrc, 0, pedges[i].x, pedges[i].y, 255); } fnFIE_save_bmp("dst_img.bmp", hsrc); // 入力画像の解放 fnFIE_free_object(hsrc); // 取得したエッジは fnOAL_free関数により解放する fnOAL_free(pedges); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_edge_sobel_subpix | ( | FHANDLE | hsrc, | |
FHANDLE | hmag, | |||
const F_EDGE_SOBEL_PARAMS * | params, | |||
UINT | feat_mode, | |||
INT | border_mode, | |||
DPNT_T | offset, | |||
F_DEDGE ** | edges, | |||
INT * | edge_num | |||
) |
ソーベルフィルタを利用したエッジ検出(サブピクセル精度)
サブピクセル精度で、ソーベルフィルタ( fnFIE_sobel() )を利用してエッジを検出します。 エッジ情報を細線化後、特徴量を抽出します。 ソーベルフィルタを利用したエッジ検出は、直感的にわかりやすいパラメータで高速で処理が可能ですが、 環境変化に弱く、対象物の焦点ずれ等によるボケが生じた場合に精度の安定性が低い傾向があります。
[-1][0][1] [-2][0][2] [-1][0][1]
[-1][-2][-1] [ 0][ 0][ 0] [ 1][ 2][ 1]
入力画像に対して、x方向、y方向のソーベルフィルタを施した微分画像をそれぞれ生成し、その後の処理をします。
[in] | hsrc | 入力画像(type:uc8 / ch:1) |
[out] | hmag | エッジ強度画像(type:us16 / ch:1) |
[in] | params | エッジ検出のための各種パラメータ |
[in] | feat_mode | 勾配方向、強度付きエッジ点構造体に保持するデータを指定するモード |
[in] | border_mode | ボーダーモード
|
[in] | offset | オフセット量 |
[out] | edges | 取得したエッジ |
[out] | edge_num | 取得したエッジ数 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 処理結果画像 |
// エラー処理は省略しているので注意して下さい #include "fie.h" #include "oal_aloc.h" INT main() { INT i; // 入力画像 FHANDLE hsrc = NULL; // パラメータ F_EDGE_SOBEL_PARAMS params; UINT feat_mode; INT border_mode; DPNT_T offset; // 取得されるエッジ F_DEDGE * pedges = NULL; // 取得されるエッジの数 INT edge_num; // FIEライブラリの初期化処理 fnFIE_setup(); // 入力画像をファイルから読み込む fnFIE_load_bmp("src_img.bmp", &hsrc, F_COLOR_IMG_TYPE_UC8); // パラメータの設定 params.mag_threshold = 40; // 強度しきい値 params.nms_length = 1; // 非極大抑制のフィルタ片幅 feat_mode = F_EDGE_FEAT_NONE; // 勾配方向、強度データ保持の指定 border_mode = F_BORDER_NONE; // ボーダー処理 offset.x = offset.y = 0.0; // オフセット量 // ソーベルフィルタを利用したエッジ検出(サブピクセル精度)の実行 fnFIE_edge_sobel_subpix(hsrc, NULL, ¶ms, feat_mode, border_mode, offset, &pedges, &edge_num); // 取得したエッジ点を入力画像上にプロットし、ファイルへ保存する for(i=0; i<edge_num; i++){ DPNT_T pnt; DOUBLE prot_val = 255.0; pnt.x = pedges[i].x; pnt.y = pedges[i].y; fnFIE_draw_point(hsrc, &prot_val, pnt); } fnFIE_save_bmp("dst_img.bmp", hsrc); // 入力画像の解放 fnFIE_free_object(hsrc); // 取得したエッジは fnOAL_free関数により解放する fnOAL_free(pedges); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_img_get_points_bin | ( | const FHANDLE | hsrc, | |
INT | color, | |||
INT | max_pnt_num, | |||
PNT_T * | pnts, | |||
INT * | pnt_num | |||
) |
2値画像からの点データ取得
2値画像から指定色の画素を点データとして取得します。 本関数の結果として得られるデータはラスタ走査順序データとなります。
点データの数が引数で指定された最大数に達した場合は処理を中断します。 ただし、この場合は正常終了となります。
[in] | hsrc | 入力画像( type:bin / ch:1 ) |
[in] | color | 対象エリア色
|
[in] | max_pnt_num | 点データの最大数 |
[out] | pnts | 点データ格納バッファ( sizeof(PNT_T) * max_pnt_num byte 必要 ) |
[out] | pnt_num | 取得された点数(0以上) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された
| |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_img_get_points_gray | ( | const FHANDLE | hsrc, | |
DOUBLE | tlow, | |||
DOUBLE | thigh, | |||
INT | max_pnt_num, | |||
PNT_T * | pnts, | |||
INT * | pnt_num | |||
) |
濃淡画像からの点データ列取得
濃淡画像から指定範囲内の濃度値をもつ画素を点データとして取得します。 本関数の結果として得られるデータはラスタ走査順序データとなります。
濃度値の範囲は tlow ≦ (濃度値) ≦ thigh とします。 画像が整数型の場合、 tlow および thigh は単純キャストで整数に変換されます。 tlow および thigh が対象となる画素タイプの濃度値範囲を超えていた場合は、サチュレーション処理が行われます。
点データの数が引数で指定された最大数に達した場合は処理を中断します。 ただし、この場合は正常終了となります。
[in] | hsrc | 入力画像( type:uc8,s16,us16,double / ch:1 ) |
[in] | tlow | 2値化閾値の下限 |
[in] | thigh | 2値化閾値の上限 |
[in] | max_pnt_num | 点データの最大数 |
[out] | pnts | 点データ格納バッファ( sizeof(PNT_T) * max_pnt_num byte 必要 ) |
[out] | pnt_num | 取得された点数(0以上) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された
| |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_nms_dir | ( | FHANDLE | hmagx, | |
FHANDLE | hmagy, | |||
FHANDLE | hthin, | |||
DOUBLE | thresh | |||
) |
非極大値の抑制(エッジ勾配方向を利用)
非極大抑制は、画像に対して1次微分を施した後に実行されます。 注目画素の勾配を、勾配方向に隣接した2つの画素の勾配と比較します。 注目画素の勾配が、隣接した画素の勾配より大きかった場合、局所的な最大値となり強度は保持されて、 後の処理に利用されます。 そうでない場合は、0が設定されます。
非極大抑制は、細線化のような効果があります。 しかしながら、勾配方向を考慮しており、処理結果は必ずしも1画素の幅の線になるとは限りません。
本関数では、出力画像の周囲1画素は0になります。 また、 hmagx と hmagy で与えられたx方向とy方向の強度は、以下のように決定されます。
hmagx , hmagy , hthin の幅、高さ共に3以上である必要があります。 また、すべての画像のサイズも同じである必要があります。
出力画像の周囲1画素は0となります。
以下に処理結果を示します。 fnFIE_sobel() により、x方向、y方向に処理した微分データを hmagx と hmagy 、そして thresh を 64 として 処理しています。 なお hmagx と hmagy は、入出力画像の画素タイプが共に F_IMG_UC8 として処理した場合を以下に示していますが、 実際の処理では出力画像の画素タイプは F_IMG_S16 として処理したデータを用いて、非極大値の抑制処理を行っています。 また細線化画像は、実際の値を85倍して表示しています。 (1)入力画像、(2)x方向微分データ画像、(3)y方向微分データ画像、(4)処理結果画像となります。
[in] | hmagx | X方向のエッジ強度画像(type:s16, double) |
[in] | hmagy | Y方向のエッジ強度画像(type:s16, double) |
[out] | hthin | 細線化画像(type:uc8) |
[in] | thresh | 非常に小さい勾配を取り除くための閾値 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された
| |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい #include "fie.h" #include "oal_aloc.h" INT main() { FHANDLE hsrc = NULL; // (1) 入力画像 FHANDLE hmagx = NULL; // (2) x方向微分データ画像 FHANDLE hmagy = NULL; // (3) y方向微分データ画像 FHANDLE hthin = NULL; // (4) 処理結果画像(細線化画像) DOUBLE thresh = 64.0; // 非常に小さい勾配を取除く為の閾値 // FIEライブラリの初期化処理 fnFIE_setup(); // 入力画像をファイルから読み込む fnFIE_load_png("src_img.png", &hsrc, F_COLOR_IMG_TYPE_UC8); // 画像オブジェクトの生成 hmagx = fnFIE_img_root_alloc(F_IMG_S16, 1, fnFIE_img_get_width(hsrc), fnFIE_img_get_height(hsrc)); hmagy = fnFIE_img_root_alloc(F_IMG_S16, 1, fnFIE_img_get_width(hsrc), fnFIE_img_get_height(hsrc)); hthin = fnFIE_img_root_alloc(F_IMG_UC8, 1, fnFIE_img_get_width(hsrc), fnFIE_img_get_height(hsrc)); // 入力画像をx方向で微分する fnFIE_sobel(hsrc, hmagx, F_SOBEL_X_MODE, F_BORDER_NONE, 0.0); // 入力画像をy方向で微分する fnFIE_sobel(hsrc, hmagy, F_SOBEL_Y_MODE, F_BORDER_NONE, 0.0); // 非極大値の抑制(エッジ勾配方向を利用)の実行 fnFIE_nms_dir(hmagx, hmagy, hthin, thresh); // 可視化の為、細線化画像の濃度値を85倍にする fnFIE_img_mul_const(hthin, 85.0, hthin); // 細線化画像をファイルへ保存する fnFIE_save_png("dst_img.png", hthin, 9); // 画像オブジェクトの解放 fnFIE_free_object(hsrc); fnFIE_free_object(hmagx); fnFIE_free_object(hmagy); fnFIE_free_object(hthin); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }