フィルタ全般
[画像フィルタ]


データ構造

struct  F_FILTER_KERNEL_T
 フィルタカーネル構造体 [詳細]

列挙型

enum  f_filter_mode {
  F_FILTER_X_MODE, F_FILTER_Y_MODE,
  F_FILTER_XY_MODE, F_FILTER_SQRT_MODE
}
 フィルタ関数用 モード指定 [詳細]
enum  f_sobel_mode {
  F_SOBEL_X_MODE, F_SOBEL_Y_MODE,
  F_SOBEL_XY_MODE, F_SOBEL_SQRT_MODE
}
 fnFIE_sobel() モード指定 [詳細]
enum  f_steger_mode { F_RIDGE_MODE, F_VALLEY_MODE }
 fnFIE_steger_filter() 線抽出モード [詳細]
enum  f_direction {
  F_DIRECT_VERT_HORIZ = 0, F_DIRECT_HORIZ_VERT = 1,
  F_DIRECT_VERT = 2, F_DIRECT_HORIZ = 3,
  F_DIRECT_RIGHT = 4, F_DIRECT_0 = 4,
  F_DIRECT_LEFT = 5, F_DIRECT_180 = 5,
  F_DIRECT_DOWN = 6, F_DIRECT_90 = 6,
  F_DIRECT_UPPER = 7, F_DIRECT_270 = 7,
  F_DIRECT_45 = 8, F_DIRECT_135 = 9,
  F_DIRECT_225 = 10, F_DIRECT_315 = 11,
  F_DIRECT_MAX4 = 12, F_DIRECT_MAX8 = 13
}
 処理方向の指定 [詳細]

関数

INT FVALGAPI fnFIE_adaptive_average (FHANDLE hsrc, FHANDLE hdst, DOUBLE delta, INT border_mode, DOUBLE border_value)
 適応的平滑化フィルタ(3×3)
INT FVALGAPI fnFIE_adaptive_averageMxN (FHANDLE hsrc, FHANDLE hdst, DOUBLE delta, INT size_m, INT size_n, INT border_mode, DOUBLE border_value)
 適応的平滑化フィルタ(m×n)
INT FVALGAPI fnFIE_average (FHANDLE fhSrc, FHANDLE fhDst, INT border_mode, DOUBLE value)
 average filter
INT FVALGAPI fnFIE_averageMxN (FHANDLE hsrc, FHANDLE hdst, INT size_m, INT size_n, INT border_mode, DOUBLE value)
 平均化フィルタ(M×N)
INT FVALGAPI fnFIE_DoA_2Dfilter (FHANDLE hsrc, FHANDLE hdst, INT size_m0, INT size_n0, INT size_m1, INT size_n1, INT border_mode, DOUBLE value)
 Difference of Average filter
INT FVALGAPI fnFIE_bfilter (FHANDLE hsrc, FHANDLE hdst, INT color, INT xdot, INT ydot, enum f_direction direct)
 2値画像ノイズ除去フィルタ
INT FVALGAPI fnFIE_bilateral (FHANDLE hsrc, FHANDLE hdst, DOUBLE sigma_s, DOUBLE sigma_r, INT border_mode, DOUBLE border_value)
 バイラテラル フィルタ
INT FVALGAPI fnFIE_correct_color_gap (FHANDLE src, FHANDLE dst, INT gap)
 3 line CCD linear sensor image color gap correction カラーラインセンサの色ずれを補正します。
INT FVALGAPI fnFIE_any_cross (FHANDLE hsrc, FHANDLE hdst, INT neib, DOUBLE bias, DOUBLE color, INT border_mode, DOUBLE value)
 任意値クロスフィルタ
INT FVALGAPI fnFIE_zero_cross (FHANDLE hsrc, FHANDLE hdst, INT neib, DOUBLE color, INT border_mode, DOUBLE value)
 ゼロクロスフィルタ
INT FVALGAPI fnFIE_any_cross_threshold (FHANDLE hsrc, FHANDLE hdst, INT neib, DOUBLE bias, DOUBLE color, DOUBLE threshold, INT border_mode, DOUBLE value)
 閾値あり任意値クロスフィルタ
INT FVALGAPI fnFIE_zero_cross_threshold (FHANDLE hsrc, FHANDLE hdst, INT neib, DOUBLE color, DOUBLE threshold, INT border_mode, DOUBLE value)
 閾値ありゼロクロスフィルタ
INT FVALGAPI fnFIE_cyclic_averageMxN (FHANDLE hsrc, FHANDLE hdst, DOUBLE lower, DOUBLE upper, INT size_m, INT size_n, INT border_mode, DOUBLE border_value)
 画素値の周期性を考慮した平滑化フィルタ(M×N)
INT FVALGAPI fnFIE_distance_transform (FHANDLE hSrc, FHANDLE hDst, INT iMode)
 2値画像の距離変換を行う
INT FVALGAPI fnFIE_gabor (FHANDLE hSrc, FHANDLE hDst, DOUBLE sigma, DOUBLE wavelen, DOUBLE orient, INT filter_mode, INT border_mode, DOUBLE border_val)
 ガボール フィルタ
INT FVALGAPI fnFIE_gaussian_approximation (FHANDLE hsrc, FHANDLE hdst, DOUBLE sigma, INT derivative_x, INT derivative_y, INT border_mode, DOUBLE border_value)
 近似ガウシアン フィルタ
INT FVALGAPI fnFIE_gaussian_1Dfilter_iir (FHANDLE fhSrc, FHANDLE fhDst, DOUBLE dSigma, INT iNDerivative, BOOL bIsVertical)
 gaussian1D filter(recursive(IIR)版)
INT FVALGAPI fnFIE_gaussian_1Dfilter_conv (FHANDLE fhSrc, FHANDLE fhDst, DOUBLE dSigma, INT iNDerivative, BOOL bIsVertical)
 gaussian1D filter(convolution(FIR)版)
INT FVALGAPI fnFIE_gaussian_1Dfilter (FHANDLE fhSrc, FHANDLE fhDst, DOUBLE dSigma, INT iNDerivative, BOOL bIsVertical, INT iMode, INT border_mode, DOUBLE value)
 gaussian1D filter
INT FVALGAPI fnFIE_gaussian_2Dfilter (FHANDLE fhSrc, FHANDLE fhDst, DOUBLE dSigma, INT iMode, INT border_mode, DOUBLE value)
 gaussian2D filter
INT FVALGAPI fnFIE_gaussian_derivative_2Dfilter (FHANDLE fhSrc, FHANDLE fhDst, DOUBLE dSigma, INT iNDerivativeX, INT iNDerivativeY, INT iMode, INT border_mode, DOUBLE value)
 derivative gaussian2D filter
INT FVALGAPI fnFIE_LoG_2Dfilter (FHANDLE fhSrc, FHANDLE fhDst, DOUBLE dSigma, INT iMode, INT border_mode, DOUBLE value)
 Laplacian of Gaussian filter
INT FVALGAPI fnFIE_DoG_2Dfilter (FHANDLE fhSrc, FHANDLE fhDst, DOUBLE dSigma1, DOUBLE dSigma2, INT iMode, INT border_mode, DOUBLE value)
 Difference of Gaussian 2D filter
INT FVALGAPI fnFIE_harris_filter (FHANDLE fhSrc, FHANDLE fhDst, DOUBLE dSigma, DOUBLE dK)
 harris corner detection filter
INT FVALGAPI fnFIE_kernel_filter (FHANDLE hsrc, FHANDLE hdst, F_FILTER_KERNEL_T *kernel, INT border_mode, DOUBLE border_value)
 任意カーネルフィルタ
INT FVALGAPI fnFIE_laplacian (FHANDLE fhSrc, FHANDLE fhDst, INT iCase, INT border_mode, DOUBLE value)
 laplacian filter
INT FVALGAPI fnFIE_meanshift_filter (FHANDLE hsrc, FHANDLE hdst, DOUBLE hs, DOUBLE hr, INT max_iter, DOUBLE tol_coef)
 Mean-Shift 法による平滑化フィルタ
INT FVALGAPI fnFIE_median (FHANDLE fhSrc, FHANDLE fhDst, INT border_mode, DOUBLE value)
 median filter
INT FVALGAPI fnFIE_rank_filter (FHANDLE fhSrc, FHANDLE fhDst, INT iRank, INT border_mode, DOUBLE value)
 rank filter
INT FVALGAPI fnFIE_median_approximation (FHANDLE fhSrc, FHANDLE fhDst, INT border_mode, DOUBLE value)
 median approximation filter
INT FVALGAPI fnFIE_medianMxN (FHANDLE hSrc, FHANDLE hTar, INT iH, INT iV, INT iBrdMod)
 median filter with variable filtering window
INT FVALGAPI fnFIE_DoM_2Dfilter (FHANDLE hsrc, FHANDLE hdst, INT size_m0, INT size_n0, INT size_m1, INT size_n1, INT border_mode, DOUBLE value)
 Difference of Median filter
INT FVALGAPI fnFIE_minMxN (FHANDLE hsrc, FHANDLE hdst, INT size_m, INT size_n, INT border_mode, DOUBLE border_val)
 最小値フィルタ (MxN)
INT FVALGAPI fnFIE_maxMxN (FHANDLE hsrc, FHANDLE hdst, INT size_m, INT size_n, INT border_mode, DOUBLE border_val)
 最大値フィルタ (MxN)
INT FVALGAPI fnFIE_kirsch (FHANDLE hsrc, FHANDLE hdst, DOUBLE denom, enum f_direction calc_mode, INT border_mode, INT border_value)
 kirsch フィルタ
INT FVALGAPI fnFIE_robinson (FHANDLE hsrc, FHANDLE hdst, DOUBLE denom, enum f_direction calc_mode, INT border_mode, INT border_value)
 robinson フィルタ
INT FVALGAPI fnFIE_prewitt (FHANDLE hsrc, FHANDLE hdst, enum f_filter_mode calc_mode, INT border_mode, DOUBLE border_value)
 prewitt フィルタ
INT FVALGAPI fnFIE_projection (FHANDLE hsrc, FHANDLE hdst, INT mode)
 画像の縦方向や横方向の投影を算出する
INT FVALGAPI fnFIE_replace_inf (FHANDLE hsrc, FHANDLE hdst, DOUBLE pval, DOUBLE mval)
 Inf(無限大)を数値に置き換える
INT FVALGAPI fnFIE_replace_nan (FHANDLE hsrc, FHANDLE hdst, DOUBLE val)
 NaN( 非数 )を数値に置き換える
INT FVALGAPI fnFIE_roberts (FHANDLE fhSrc, FHANDLE fhDst, INT border_mode, DOUBLE value)
 roberts filter
INT FVALGAPI fnFIE_sharp (FHANDLE hsrc, FHANDLE hdst, INT border_mode, DOUBLE border_value)
 鮮鋭化フィルタ
INT FVALGAPI fnFIE_sobel (FHANDLE hsrc, FHANDLE hdst, INT calc_mode, INT border_mode, DOUBLE border_value)
 sobel フィルタ
INT FVALGAPI fnFIE_sobel_dir (FHANDLE hsrc, FHANDLE hdst, INT border_mode, DOUBLE border_value)
 sobel フィルタ
INT FVALGAPI fnFIE_solodel (const FHANDLE hSrc, FHANDLE hDst, INT color)
 孤立点除去
INT FVALGAPI fnFIE_steger_filter (FHANDLE hsrc, FHANDLE hdst, FHANDLE hdir, DOUBLE sigma, DOUBLE thresh, INT line_mode)
 steger line/curve extraction filter
INT FVALGAPI fnFIE_steger_filter_edges (FHANDLE hsrc, FHANDLE hdst, FHANDLE hdir, DOUBLE sigma, DOUBLE thresh, INT line_mode, F_EDGE **edges, INT *edge_num)
 エッジ出力付きステガーフィルタ(ピクセル精度)
INT FVALGAPI fnFIE_thinning_filter (FHANDLE hsrc, FHANDLE hdst, INT color_mode, INT iMode)
 細線化フィルタ
INT FVALGAPI fnFIE_trimmed_averageMxN (FHANDLE hsrc, FHANDLE hdst, INT size_m, INT size_n, DOUBLE rate_high, DOUBLE rate_low, INT border_mode, DOUBLE border_value)
 中間項平均化フィルタ(MxN)
INT FVALGAPI fnFIE_varianceMxN (FHANDLE hsrc, FHANDLE hdst, INT size_m, INT size_n, INT border_mode, DOUBLE value)
 分散フィルタ(M×N)
INT FVALGAPI fnFIE_wiener (FHANDLE hsrc, FHANDLE hdst, F_FILTER_KERNEL_T *kernel, DOUBLE gamma)
 ウィーナフィルタによる画像復元
INT FVALGAPI fnFIE_add_noise_uniform (FHANDLE hSrc, FHANDLE hDst, DOUBLE low, DOUBLE high, UINT seed)
  [[OSS]] uniform noise 付加フィルタ
INT FVALGAPI fnFIE_add_noise_gauss (FHANDLE hSrc, FHANDLE hDst, DOUBLE ave, DOUBLE var, UINT seed)
  [[OSS]] gauss noise 付加フィルタ
INT FVALGAPI fnFIE_add_noise_salt_and_pepper (FHANDLE hSrc, FHANDLE hDst, DOUBLE salt_rate, DOUBLE salt_val, DOUBLE pepper_rate, DOUBLE pepper_val, UINT seed)
  [[OSS]] salt-and-pepper noise 付加フィルタ

列挙型

フィルタ関数用 モード指定

フィルタ関数群で使用するモード指定用の定数

列挙型の値:
F_FILTER_X_MODE  X方向微分
F_FILTER_Y_MODE  Y方向微分
F_FILTER_XY_MODE  X方向微分とY方向微分の絶対値和
F_FILTER_SQRT_MODE  X方向微分とY方向微分のユークリッド距離

fnFIE_sobel() モード指定

列挙型の値:
F_SOBEL_X_MODE  X方向微分
F_SOBEL_Y_MODE  Y方向微分
F_SOBEL_XY_MODE  X方向微分とY方向微分の絶対値和
F_SOBEL_SQRT_MODE  X方向微分とY方向微分のユークリッド距離

fnFIE_steger_filter() 線抽出モード

列挙型の値:
F_RIDGE_MODE  輝度が周囲画素よりも高い線
F_VALLEY_MODE  輝度が周囲画素よりも低い線

処理方向の指定

列挙型の値:
F_DIRECT_VERT_HORIZ  垂直→水平方向
F_DIRECT_HORIZ_VERT  水平→垂直方向
F_DIRECT_VERT  垂直方向
F_DIRECT_HORIZ  水平方向
F_DIRECT_RIGHT  画面右向き
F_DIRECT_0  0度方向(==F_DIRECT_RIGHT)
F_DIRECT_LEFT  画面左向き
F_DIRECT_180  180度方向(==F_DIRECT_LEFT)
F_DIRECT_DOWN  画面下向き
F_DIRECT_90  90度方向(==F_DIRECT_DOWN)
F_DIRECT_UPPER  画面上向き
F_DIRECT_270  270度方向(==F_DIRECT_UPPER)
F_DIRECT_45  45度方向
F_DIRECT_135  135度方向
F_DIRECT_225  225度方向
F_DIRECT_315  315度方向
F_DIRECT_MAX4  0,90,180,270 の最大値
F_DIRECT_MAX8  0,45,...,315 の最大値


関数

INT FVALGAPI fnFIE_adaptive_average ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  delta,
INT  border_mode,
DOUBLE  border_value 
)

適応的平滑化フィルタ(3×3)

適応的平滑化フィルタを入力画像に適応し、出力画像に結果を出力します。 注目画素$(i, j)$を中心とする3×3の領域(注目画素+8近傍)において、以下の ような演算で注目画素の値を置き換えるフィルタです。ここで、$f(x, y)$を入力画像の 画素$(x, y)$の濃度値、$g(x, y)$を出力画像の画素$(x, y)$の濃度値とします。

\[ g_{(i,j)} =\frac{1}{9} \sum^{i+1}_{k=i-1}\sum^{j+1}_{l=j-1} F(k,l) \]

ただし

\[ F(k,l) = \left\{ \begin{array}{ll} f(k,l) & \mbox{ if $ \left| f(k,l) - f(i,j) \right| \leq \Delta $, } \\ f(i,j) & \mbox{ otherwise } \\ \end{array} \right. \]

ここで、$\Delta$は引数 delta によって指定される差分の閾値です。

すなわち、近傍8画素に対して、注目画素との濃度値の差分が$\Delta$を超えた画素の濃度を 注目画素の濃度値で置き換え、3×3の平均値を計算した値が出力画像の画素値になります。

これにより、$\Delta$を超える濃度差があるような画素(エッジ等)を保ったままで、画像を平滑化 することができます。たとえば、物体の輪郭を鮮明にしたまま、画像全体を平滑化したい場合などに有効です。

出力画像がDOUBLE型の場合を除き、小数点以下の値は切り捨てになります。

delta は0よりも大きい値である必要があります。

入力画像と出力画像は下記の条件を満たしている必要があります。

  • 入力画像と出力画像の幅と高さは同じである
  • チャネル数が同じである

各入出力画像型の対応は下表のようになります。

  出力画像
UC8 S16 US16 DOUBLE
入力画像 UC8 × ×
S16 × ×
US16 × ×
DOUBLE × × ×

ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, double )
[out] hdst 出力画像 ( 入力画像の型と同じ 又はdouble型 )
[in] delta 濃度差分の閾値 ( 0よりも大きい値 )
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は,この値は無視されます。
戻り値:
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"   //メモリ管理




/*
作成したテスト画像に対して適応的平滑化を実行します。
通常の平滑化フィルタ(fnFIE_average)も同時に行い、処理結果の比較も行います。
*/
VOID AdaptiveAverage()
{
    FHANDLE hsrc = NULL;    //入力画像用ハンドル 
    FHANDLE hdst = NULL;    //出力画像用ハンドル
    FHANDLE hcomp = NULL;   //比較画像用ハンドル
    
    INT width = 200;        //画像幅
    INT height = 200;       //画像高さ
    INT channel = 1;        //チャンネル数
    
    //フィルタ用パラメータ
    DOUBLE delta = 105;     //適応的平滑化のDelta値
    

    //画像領域の確保と入力画像の作成
    hsrc = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height );
    hdst = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);
    hcomp = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);

    //出力領域は、一度初期化
    fnFIE_img_clear(hdst, 0 );
    fnFIE_img_clear(hcomp, 0 );
    

    //入力画像の読み込み
    //この例では、チェスボード画像にランダムに±100のノイズを付与した画像を使用します
    fnFIE_load_png( "fie_adapt_ave_src.png", &hsrc, F_COLOR_IMG_TYPE_UC8 );
    
    //適応的平滑化フィルタ 
    fnFIE_adaptive_average( hsrc, hdst, delta, F_BORDER_NONE, 0 );

    //比較のための、平均化フィルタ処理
    fnFIE_average( hsrc, hcomp, F_BORDER_NONE, 0 );

    //作成した画像を保存
    fnFIE_save_png( "fie_adapt_ave_dst.png", hdst, -1 ); 
    fnFIE_save_png( "fie_adapt_ave_comp.png", hcomp, -1 ); 


    //後処理
    fnFIE_free_object( hsrc );
    fnFIE_free_object( hdst );
    fnFIE_free_object( hcomp );
    
}



INT main(VOID)
{

    //ライブラリのセットアップ
    fnFIE_setup();

    //処理本体
    AdaptiveAverage();

    //ライブラリの終了処理
    fnFIE_teardown();

    return 0;
}

処理結果例:
fie_adapt_ave_src.png

入力画像

fie_adapt_ave_dst.png

出力画像

fie_adapt_ave_comp.png

比較画像(average filter)

INT FVALGAPI fnFIE_adaptive_averageMxN ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  delta,
INT  size_m,
INT  size_n,
INT  border_mode,
DOUBLE  border_value 
)

適応的平滑化フィルタ(m×n)

任意のフィルタサイズ(m×n)での適応的平滑化を入力画像に適応し、 その結果を出力画像に出力します。基本的な処理内容は fnFIE_adaptive_average() と 同じですが、こちらはフィルタサイズを任意のサイズに指定することができます。

注目画素$(i, j)$を中心とするm×nの領域において、領域内の各画素に対して 注目画素との濃度値の差分を求めます。
差分が delta の値を超えた画素の濃度を注目画素の濃度値で置き換え、 m×nの平均値を計算した値が、注目画素の画素値になります。

その際、出力画像がDOUBLE型の場合を除き、小数点以下の値は切り捨てになります。

delta は0よりも大きい値である必要があります。

フィルタサイズは下記の条件を満たしている必要があります。

  • フィルタの幅、高さが共に1以上の奇数である
  • フィルタサイズが画像サイズ以下である

入力画像と出力画像は下記の条件を満たしている必要があります。

  • 入力画像と出力画像の幅と高さは同じである
  • チャネル数が同じである

各入出力画像型の対応は下表のようになります。

  出力画像
UC8 S16 US16 DOUBLE
入力画像 UC8 × ×
S16 × ×
US16 × ×
DOUBLE × × ×

ボーダー処理モードがF_BORDER_NONEの時、

  • 画像の左右$ \lfloor \frac{m}{2} \rfloor$画素
  • 画像の上下$ \lfloor \frac{n}{2} \rfloor$画素

は処理されません。

ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

なお、指定したフィルタのサイズが幅、高さ共に1であった場合は、単に入力画像をコピーして出力する 処理となります。その際、ボーダー処理の指定は全て無視されます。

引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, double )
[out] hdst 出力画像 ( 入力画像の型と同じ 又はdouble型 )
[in] delta 濃度差分の閾値 ( 0よりも大きい値 )
[in] size_m フィルタの幅( 水平方向 1以上画像幅以下の奇数)
[in] size_n フィルタの高さ( 垂直方向 1以上画像高さ以下の奇数)
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は,この値は無視されます。
戻り値:
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"   //メモリ管理


/*
作成したテスト画像に対してMxN適応的平滑化を実行します。
通常のMxN平滑化フィルタ(fnFIE_averageMxN)も同時に行い、処理結果の比較も行います。
*/
VOID AdaptiveAverageMxN()
{
    //画像用変数定義
    FHANDLE hsrc = NULL;    //入力画像用ハンドル
    FHANDLE hdst = NULL;    //出力画像用ハンドル
    FHANDLE hcomp = NULL;   //比較画像用ハンドル

    INT width = 200;        //画像幅
    INT height = 200;       //画像高さ
    INT channel = 1;        //チャンネル数

                
    //フィルタ用パラメータ]
    INT size_m, size_n;     //フィルタサイズ
    DOUBLE delta = 105;     //適応的平滑化のDelta値


    //画像領域の確保と入力画像の作成
    hsrc = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);
    hdst = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);
    hcomp = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);

    //出力領域は、一度初期化
    fnFIE_img_clear(hdst, 0 );
    fnFIE_img_clear(hcomp, 0 );


    //入力画像の読み込み
    //この例では、チェスボード画像にランダムに±100のノイズを付与した画像を使用します
    fnFIE_load_png( "fie_adapt_ave_mxn_src.png", &hsrc, F_COLOR_IMG_TYPE_UC8 );



    /*--- フィルタサイズによる違いも見るため、いくつかのサイズで処理を行う  ---*/

    //--- サイズ5x5 ---
    size_m = 5;
    size_n = 5;

    //MxN適応的平滑化  
    fnFIE_adaptive_averageMxN( hsrc, hdst, delta, size_m, size_n,  F_BORDER_NONE, 0 );

    //比較のための、MxN平均化フィルタ処理
    fnFIE_averageMxN( hsrc, hcomp, size_m, size_n, F_BORDER_NONE, 0 );

    //作成した画像を保存
    fnFIE_save_png( "fie_adapt_ave5x5_dst.png", hdst, -1 ); 
    fnFIE_save_png( "fie_adapt_ave5x5_comp.png", hcomp, -1 ); 

    //変数を使い回すので、出力先のオブジェクトを一度解放する
    fnFIE_free_object( hdst );
    fnFIE_free_object( hcomp );
    hdst = NULL;
    hcomp = NULL;

    hdst = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);
    hcomp = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);
    fnFIE_img_clear(hdst, 0 );
    fnFIE_img_clear(hcomp, 0 );


    //--- サイズ7x7 ---
    size_m = 7;
    size_n = 7;

    //MxN適応的平滑化  
    fnFIE_adaptive_averageMxN( hsrc, hdst, delta, size_m, size_n,  F_BORDER_NONE, 0 );

    //比較のための、MxN平均化フィルタ処理
    fnFIE_averageMxN( hsrc, hcomp, size_m, size_n, F_BORDER_NONE, 0 );

    //作成した画像を保存
    fnFIE_save_png( "fie_adapt_ave7x7_dst.png", hdst, -1 ); 
    fnFIE_save_png( "fie_adapt_ave7x7_comp.png", hcomp, -1 ); 

    //変数を使い回すので、出力先のオブジェクトを一度解放する
    fnFIE_free_object( hdst );
    fnFIE_free_object( hcomp );
    hdst = NULL;
    hcomp = NULL;

    hdst = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);
    hcomp = fnFIE_img_root_alloc( F_IMG_UC8, channel, width, height);
    fnFIE_img_clear(hdst, 0 );
    fnFIE_img_clear(hcomp, 0 );


    //--- サイズ15x15 ---
    size_m = 15; 
    size_n = 15;
    //MxN適応的平滑化  
    fnFIE_adaptive_averageMxN( hsrc, hdst, delta, size_m, size_n,  F_BORDER_NONE, 0 );
    //比較のための、MxN平均化フィルタ処理
    fnFIE_averageMxN( hsrc, hcomp, size_m, size_n, F_BORDER_NONE, 0 );

    //作成した画像を保存
    fnFIE_save_png( "fie_adapt_ave15x15_dst.png", hdst, -1 ); 
    fnFIE_save_png( "fie_adapt_ave15x15_comp.png", hcomp, -1 ); 


    //後処理
    fnFIE_free_object( hsrc );
    fnFIE_free_object( hdst );
    fnFIE_free_object( hcomp );
    
}





INT main(VOID)
{

    //ライブラリのセットアップ
    fnFIE_setup();

    //処理本体
    AdaptiveAverageMxN();

    //ライブラリの終了処理
    fnFIE_teardown();

    return 0;
}

処理結果例:
fie_adapt_ave_mxn_src.png

入力画像

fie_adapt_ave5x5_dst.png

出力画像(5x5)

fie_adapt_ave5x5_comp.png

比較画像(MxN average filter 5x5)

fie_adapt_ave7x7_dst.png

出力画像(7x7)

fie_adapt_ave7x7_comp.png

比較画像(MxN average filter 7x7)

fie_adapt_ave15x15_dst.png

出力画像(15x15)

fie_adapt_ave15x15_comp.png

比較画像(MxN average filter 15x15)

INT FVALGAPI fnFIE_average ( FHANDLE  fhSrc,
FHANDLE  fhDst,
INT  border_mode,
DOUBLE  value 
)

average filter

average filterを施す。 次のようなマトリックスによる3×3の線形フィルタを施します。

	[1][1][1]
	[1][1][1]
	[1][1][1]

	div : 9
	
割り切れない場合は小数点以下切捨てます(DOUBLE, FLOATを除く)。 なお、フィルタのアンカー位置は、フィルタの中心となります。

ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

入出力画像がRGBTRIPLE型の場合、R、G、Bそれぞれが平均化された画像が出力されます。 入出力画像がRGBQUAD型の場合、R、G、Bそれぞれが平均化された画像が出力されます。 出力側のrgbReservedの値は全て0になります。

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, i32, ui32, i64, float, double, rgbq, rgbtri )
[out] fhDst 処理結果画像( type: uc8, s16, us16, i32, ui32, i64, float, double, rgbq, rgbtri )
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常( border_mode 異常 )
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_copy_border()
処理結果例:
floppy1.png

入力画像

fie_average.png

処理結果画像

INT FVALGAPI fnFIE_averageMxN ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  size_m,
INT  size_n,
INT  border_mode,
DOUBLE  value 
)

平均化フィルタ(M×N)

任意のフィルタサイズ(M×N)において平均化フィルタを施します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

フィルタサイズは下記の条件を満たしている必要があります。

  • フィルタの幅と高さが共に1以上の奇数である
  • フィルタのサイズは画像サイズ以下である

入力画像と出力画像は下記の条件を満たしている必要があります。

  • 入力画像と出力画像の幅と高さは同じである
  • 入力画像と出力画像のチャネル数は同じである

各入出力画像型の対応は下表のようになります。

  出力画像
UC8 S16 US16 I32 UI32 FLOAT DOUBLE RGBQUAD RGBTRIPLE
入力画像 UC8 × × × × × ×
S16 × × × × × ×
US16 × × × × × ×
I32 × × × × × ×
UI32 × × × × × ×
FLOAT × × × × × × ×
DOUBLE × × × × × × × ×
RGBQUAD × × × × × × ×
RGBTRIPLE × × × × × × ×

入力画像がRGBTRIPLE型の場合、R、G、Bそれぞれが平均化された画像が出力されます。 入力画像がRGBQUAD型の場合、R、G、Bそれぞれが平均化された画像が出力されます。rgbReservedの値は無視されます。 出力画像がRGBQUAD型の場合、出力側のrgbReservedの値は全て0になります。

なお、指定したフィルタのサイズが幅、高さ共に1であった場合は、単に入力画像をコピーして出力する 処理となります。その際、ボーダー処理の指定は全て無視されます。

引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, i32, ui32, float, double, rgbq, rgbtri )
[out] hdst 出力画像 ( type: uc8, s16, us16, i32, ui32, float, double, rgbq, rgbtri )
[in] size_m フィルタの幅( 水平方向 1以上画像幅以下の奇数)
[in] size_n フィルタの高さ( 垂直方向 1以上画像高さ以下の奇数)
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は,この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_DoA_2Dfilter ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  size_m0,
INT  size_n0,
INT  size_m1,
INT  size_n1,
INT  border_mode,
DOUBLE  value 
)

Difference of Average filter

size_m0 x size_n0 のサイズの平均化フィルタを適用した画像から size_m1 x size_n1 のサイズの平均化フィルタ適用した画像を引いて得られる画像を出力します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

処理対象画像がF_IMG_UC8,F_IMG_US16型のとき、結果値がマイナス値となる場合は絶対値を出力します。 F_IMG_S16 型では、演算結果がオーバーフローする場合があるため、サチュレーション処理を行った後に出力します。

入力画像と出力画像は下記の条件をすべて満たしている必要があります。

  • サイズ(幅・高さ)、チャネル数、画像の型が等しい
  • 入力画像の型はF_IMG_UC8,F_IMG_S16,F_IMG_US16,F_IMG_DOUBLE,F_IMG_RGBQUAD のいずれか

フィルタサイズは下記の条件を満たしている必要があります。

  • フィルタの幅と高さが共に1以上の奇数である
  • フィルタのサイズは画像サイズ以下である

ボーダー処理モードがF_BORDER_NONEの時、 m:size_m0size_m1 のうち小さくない方、 n:size_n0size_n1 のうち小さくない方、とすると

  • 画像の左右$ \lfloor \frac{m}{2} \rfloor$画素
  • 画像の上下$ \lfloor \frac{n}{2} \rfloor$画素

は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, double, rgbq )
[out] hdst 出力画像 ( type: uc8, s16, us16, double, rgbq )
[in] size_m0 フィルタ幅( 水平方向 1以上画像幅以下の奇数 )
[in] size_n0 フィルタ高さ ( 垂直方向 1以上画像幅以下の奇数 )
[in] size_m1 フィルタ幅( 水平方向 1以上画像幅以下の奇数 )
[in] size_n1 フィルタ高さ ( 垂直方向 1以上画像幅以下の奇数 )
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は,この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_bfilter ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  color,
INT  xdot,
INT  ydot,
enum f_direction  direct 
)

2値画像ノイズ除去フィルタ

水平または垂直方向に連続した、白または黒のランの画素数(ランレングス)を用い、 これがある値( xdot , ydot )以下の場合にノイズと考えて除去します。

color パラメータはノイズ除去の対象となるエリア色を決定するパラメータです。 白黒両方( color = 2 )は、白のランを除去した後に黒のランを除去、 または黒のランを除去した後に白のランを除去するという処理ではありません。 条件に合う白のランと黒のランを同時に除去します。 もし上記したように、白のランを除去した後に黒のランを除去、 または黒のランを除去した後に白のランを除去したい場合には、 color を変更しながら本関数を2回実行してください。

fie_bfilt_bfilter_color.png

xdot パラメータは水平方向のノイズ除去画素数を指定します。

fie_bfilt_bfilter_xdot.png

ydot パラメータは垂直方向のノイズ除去画素数を指定します。

fie_bfilt_bfilter_ydot.png

direct パラメータはノイズ除去を行う方向を決定するパラメータです。

fie_bfilt_bfilter_direction.png

入力画像、出力画像共に、画素タイプが F_IMG_BIN 、チャネル数が1である必要があります。 また、入力画像と出力画像のサイズが同じである必要があります。

水平、垂直除去画素数は、共に1以上を入力してください。 ただし、方向が F_DIRECT_VERT を指定している場合は xdot 、 F_DIRECT_HORIZ を指定している場合は ydot が無視されます。

引数:
[in] hsrc 入力画像( type : bin / ch : 1 )
[out] hdst 出力画像( type : bin / ch : 1 )
[in] color 対象色
  • 0 黒
  • 1 白
  • 2 白黒両方
[in] xdot 水平除去画素数(1以上)
[in] ydot 垂直除去画素数(1以上)
[in] direct 方向
  • F_DIRECT_VERT_HORIZ(垂直→水平)
  • F_DIRECT_HORIZ_VERT(水平→垂直)
  • F_DIRECT_VERT(垂直)
  • F_DIRECT_HORIZ(水平)
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された。
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_bilateral ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  sigma_s,
DOUBLE  sigma_r,
INT  border_mode,
DOUBLE  border_value 
)

バイラテラル フィルタ

バイラテラル フィルタでは、2次元 ガウス フィルタのように近傍画素を空間方向のガウス関数で重み付けしながら平滑化を行いますが、 その際注目画素との濃度差に応じて重みを増減させます。
濃度差に応じた重み付けは濃度方向のガウス関数により行われ、濃度差が大きいほど重みが低くなります。 これにより輪郭(エッジ)を保ったまま画像の平滑化効果を得ることが出来ます。

入力画像の座標 $(x,y)$ における濃度値を $f(x,y)$ とすると、出力画像の座標 $(x,y)$ における濃度値 $g(x,y)$ は下式のようになります。

\[ g(x,y) = \frac{ \displaystyle \sum^W_{n=-W}\sum^W_{m=-W} \exp\left( -\frac{m^{2}+n^{2}}{2\sigma_{S}^{2}} \right) \exp\left( -\frac{(f(x,y)-f(x+m,y+n))^{2}}{2\sigma_{R}^{2}} \right) f(x+m,y+n) }{ \displaystyle \sum^W_{n=-W}\sum^W_{m=-W} \exp\left( -\frac{m^{2}+n^{2}}{2\sigma_{S}^{2}} \right) \exp\left( -\frac{(f(x,y)-f(x+m,y+n))^{2}}{2\sigma_{R}^{2}} \right) } \]

ここで $\sigma_{S}$ は 空間方向 ガウス関数 の標準偏差、$\sigma_{R}$ は 濃度方向 ガウス関数 の標準偏差となります。

$\sigma_{S}$ を大きくしていくと、注目画素と距離が離れた近傍画素の影響を受けやすくなり、平滑化効果が高くなります。
$\sigma_{R}$ を小さくしていくと、注目画素との濃度差が大きい近傍画素の影響を受けにくくなり、輪郭(エッジ)保存効果が高くなります。

また平滑化を行う近傍領域のサイズは $\left(2W+1\right) \times \left(2W+1\right)$ となりますが、このサイズは $\sigma_{S}$ の設定値により適切に決定されます。

境界部分処理について
本関数では局所領域の情報を使って処理を行うため、ボーダー処理モードに F_BORDER_NONE を指定した場合、 画像の周囲に処理されない (出力が行われない) 領域が出来ます。 ボーダー処理モードに F_BORDER_NONE 以外を指定した場合、内部でボーダー拡張処理が行われ 画像の全面に対して 処理が行われます。 ボーダー処理モードの詳細な仕様については fnFIE_copy_border() を参照して下さい。
入出力画像について
入力画像と出力画像の 画像型、幅、高さ、チャネル数 は同じでなければなりません。
引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, double )
[out] hdst 出力画像 ( type: uc8, s16, us16, double )
[in] sigma_s 空間方向の標準偏差 $\sigma_{S}$ (単位 : pixel, 0.4 <= sigma_s)
[in] sigma_r 濃度方向の標準偏差 $\sigma_{R}$ (単位 : 濃度, 0 < sigma_r)
[in] border_mode ボーダー処理モード. 下記のいずれかを指定.
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値.
border_mode が F_BORDER_VALUE の場合のみ使用されます. その他のモードの場合、この値は無視されます.
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
入力画像
fie_bilateral_src.png
 
結果画像 ($\sigma_{S}$= 1.5, $\sigma_{R}$= 20) 結果画像 ($\sigma_{S}$= 1.5, $\sigma_{R}$= 40)
fie_bilateral_ss15_sr20.png
fie_bilateral_ss15_sr40.png
 
結果画像 ($\sigma_{S}$= 3.0, $\sigma_{R}$= 20) 結果画像 ($\sigma_{S}$= 3.0, $\sigma_{R}$= 40)
fie_bilateral_ss30_sr20.png
fie_bilateral_ss30_sr40.png

INT FVALGAPI fnFIE_correct_color_gap ( FHANDLE  src,
FHANDLE  dst,
INT  gap 
)

3 line CCD linear sensor image color gap correction カラーラインセンサの色ずれを補正します。

3ライン方式のカラーラインセンサでは、RGBそれぞれで移動する撮像対象の異なった位置を撮影しています。

color_line_sensor1.png

3 line CCD

3ライン方式のカラーラインセンサで単純に撮像すると以下のような画像になります。
color_line_sensor2.png

色ずれ

当フィルタで画像の縦方向の色ずれを補正することで正常な画像を得ることができます。
color_line_sensor3.png

色ずれ補正結果

色ズレ補正量 gap
入力画像の高さを $h$ としたとき、値域は $-\frac{h}{2}<gap<\frac{h}{2}$ です。
gap が正の値の時、画像のR成分は画像の下方向へ gap ラインだけずれ、 画像のB成分は画像の上方向へ gap ラインだけずれるように補正します。 gap が負の値の時、画像のR成分は画像の上方向へ $ |gap| $ ラインだけずれ、 画像のB成分は画像の下方向へ $ |gap| $ ラインだけずれるように補正します。 ゼロの場合は入力画像と同様の画像を出力します。
なお、出力画像の上下 $ |gap| $ ラインはゼロクリアされます。不足する色があるためです。
入出力の条件
入力画像と出力画像は同じサイズでなければなりません。出力画像は1chのF_IMG_RGBQUAD型画像か、3chのF_IMG_UC8型画像でなければなりません。
また、色ずれ補正量 gap の絶対値は 画像高さの半分より小さい必要があります。
引数:
[in] src 入力画像(type:rgbq ch:1)
[out] dst 出力画像(type:rgbq ch:1)(type:uc8 ch:3)
[in] gap 色ずれ補正量
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された
F_ERR_INVALID_PARAM パラメータ異常 gapの2倍が画像高さ以上だった
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_any_cross ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  neib,
DOUBLE  bias,
DOUBLE  color,
INT  border_mode,
DOUBLE  value 
)

任意値クロスフィルタ

任意値クロスフィルタを実行します。 処理範囲内の濃淡画像に対して bias 値との交差点を検出します。

fie_any_cross.png

本関数は、 fnFIE_zero_cross() と異なり、符号なし濃淡画像にも対応します。 交差点と判定された画素の濃度値は color となり、それ以外の画素の濃度値は0となります。 ただし、出力画像の画素タイプがF_IMG_BINの場合、 color は無視されます。 交差点と判定された画素の濃度値は1となります。

入力画像が整数型の場合、 bias は単純キャストで整数に変換されます。 出力画像が F_IMG_UC8 型の場合、 color は単純キャストで整数に変換されます。 color および bias が対象となる画素タイプの濃度値範囲を超えていた場合は、サチュレーション処理が行われます。

入出力画像は以下の条件を満たす必要があります。

  • 入力画像の画素タイプは、F_IMG_UC8、F_IMG_S16、F_IMG_US16、またはF_IMG_DOUBLEでなければなりません。
  • 出力画像の画素タイプは、F_IMG_BIN、またはF_IMG_UC8でなければなりません。
  • 入力画像と出力画像の画素タイプの組み合わせは、対象となるすべての組合せが可能です。
  • 入力画像と出力画像はサイズは同じでなければなりません。
  • 画像の幅、高さは3以上でなければなりません。
  • チャネル数は、共に1でなければなりません。
ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は0となります。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hsrc 入力画像(type:uc8,s16,us16,double / ch:1)
[out] hdst 出力画像(type:bin,uc8 / ch:1)
[in] neib 4近傍/8近傍の指定。 4:4近傍 8:8近傍
[in] bias バイアス(0とみなす値)
[in] color エッジの際に入れる値
hdst の画素タイプが F_IMG_BIN の場合は無視されます
[in] border_mode ボーダーモード。下記のいずれかを指定
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値
border_mode が F_BORDER_VALUEの場合のみ使用されます。 その他のボーダーモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_zero_cross(), fnFIE_copy_border()
処理結果例:
  1. 入力画像
  2. fnFIE_LoG_2Dfilter() 処理後の画像
  3. 2の画像を fnFIE_any_cross() で処理した結果画像
なお、 fnFIE_any_cross() では bias を0.5として処理をしています。 また、 fnFIE_LoG_2Dfilter() 処理後の画像は、見やすくするために加工してありますので注意してください。
fie_any_cross2.png

INT FVALGAPI fnFIE_zero_cross ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  neib,
DOUBLE  color,
INT  border_mode,
DOUBLE  value 
)

ゼロクロスフィルタ

ゼロクロスフィルタを実行します。 符号あり濃淡画像において零交差点を検出します。 主に2次微分処理後の画像に対して零交差位置を抽出するために使用します。

fie_zero_cross.png

零交差点と判定された画素の濃度値は color となり、それ以外の画素の濃度値は0となります。 ただし、出力画像の画素タイプがF_IMG_BINの場合、 color は無視されます。 零交差点と判定された画素の濃度値は1となります。

出力画像が F_IMG_UC8 型の場合、 color は単純キャストで整数に変換されます。 color が対象となる画素タイプの濃度値範囲を超えていた場合は、サチュレーション処理が行われます。

入出力画像は以下の条件を満たす必要があります。

  • 入力画像の画素タイプは、F_IMG_S16、またはF_IMG_DOUBLEでなければなりません。
  • 出力画像の画素タイプは、F_IMG_BIN、またはF_IMG_UC8でなければなりません。
  • 入力画像と出力画像の画素タイプの組み合わせは、対象となるすべての組合せが可能です。
  • 入力画像と出力画像はサイズは同じでなければなりません。
  • 画像の幅、高さは3以上でなければなりません。
  • チャネル数は、共に1でなければなりません。
ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は0となります。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hsrc 入力画像(type:s16,double / ch:1)
[out] hdst 出力画像(type:bin,uc8 / ch:1)
[in] neib 4近傍/8近傍の指定。 4:4近傍 8:8近傍
[in] color エッジの際に入れる値
hdst の画素タイプが F_IMG_BIN の場合は無視されます
[in] border_mode ボーダーモード。下記のいずれかを指定
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値
border_mode が F_BORDER_VALUE の場合のみ使用されます。 その他のボーダーモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_any_cross(), fnFIE_copy_border()
処理結果例:
  1. 入力画像
  2. fnFIE_LoG_2Dfilter() 処理後の画像
  3. 2の画像を fnFIE_zero_cross() で処理した結果画像
なお、 fnFIE_LoG_2Dfilter() 処理後の画像は、見やすくするために加工してありますので注意してください。
fie_zero_cross2.png

INT FVALGAPI fnFIE_any_cross_threshold ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  neib,
DOUBLE  bias,
DOUBLE  color,
DOUBLE  threshold,
INT  border_mode,
DOUBLE  value 
)

閾値あり任意値クロスフィルタ

閾値あり任意値クロスフィルタを実行します。 処理範囲内の濃淡画像に対して、bias 値との交差点を検出します。

fie_any_cross_thr.png

本関数は、 fnFIE_any_cross() に対して閾値を指定できるように拡張したものです。 交差点を求めた画素間の変化量がこの閾値以上の場合のみ交差点とします。 つまり閾値を0とした場合に、 fnFIE_any_cross() と同じ意味となります。

また、 fnFIE_zero_cross_threshold() と異なり、符号なし濃淡画像にも対応します。 交差点と判定された画素の濃度値は color となり、それ以外の画素の濃度値は0となります。 ただし、出力画像の画素タイプがF_IMG_BINの場合、 color は無視されます。 交差点と判定された画素の濃度値は1となります。

入力画像が整数型の場合、 bias は単純キャストで整数に変換されます。 出力画像が F_IMG_UC8 型の場合、 color は単純キャストで整数に変換されます。 color および bias が対象となる画素タイプの濃度値範囲を超えていた場合は、サチュレーション処理が行われます。
そして入力画像が整数型の場合、 threshold は単純キャストで整数に変換されます。 対象となる画素タイプの濃度値範囲を超えた場合も、サチュレーション処理は行われません。

入出力画像は以下の条件を満たす必要があります。

  • 入力画像の画素タイプは、F_IMG_UC8、F_IMG_S16、F_IMG_US16、F_IMG_DOUBLEでなければなりません。
  • 出力画像の画素タイプは、F_IMG_BIN、F_IMG_UC8でなければなりません。
  • 入力画像と出力画像の画素タイプの組み合わせは、対象となるすべての組合せが可能です。
  • 入力画像と出力画像はサイズは同じでなければなりません。
  • 画像の幅、高さは3以上でなければなりません。
  • チャネル数は、共に1でなければなりません。
ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は0となります。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hsrc 入力画像(type:uc8,s16,us16,double / ch:1)
[out] hdst 出力画像(type:bin,uc8 / ch:1)
[in] neib 4近傍/8近傍の指定。 4:4近傍 8:8近傍
[in] bias バイアス(0とみなす値)
[in] color エッジの際に入れる値
hdst の画素タイプが F_IMG_BIN の場合は無視されます
[in] threshold 変化量のための閾値(0以上)
変化量が閾値以上の場合にエッジとみなします
[in] border_mode ボーダーモード。下記のいずれかを指定
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値
border_mode が F_BORDER_VALUEの場合のみ使用されます。 その他のボーダーモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_any_cross() , fnFIE_zero_cross_threshold(), fnFIE_copy_border()
処理結果例:
  1. 入力画像
  2. fnFIE_LoG_2Dfilter() 処理後の画像
  3. fnFIE_any_cross() 処理後の結果画像
  4. 2の画像を fnFIE_any_cross_threshold() にて処理した結果画像
なお、 fnFIE_any_cross() では bias を1.0、 fnFIE_any_cross_threshold() では、 bias を1.0、 threshold を4として処理をしています。 また、 fnFIE_LoG_2Dfilter() 処理後の画像は、見やすくするために加工してありますので注意してください。 適切な閾値を指定することで、閾値なしの任意値クロスフィルタに存在する余分な交差点が消えています。
fie_any_cross_thr2.png

INT FVALGAPI fnFIE_zero_cross_threshold ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  neib,
DOUBLE  color,
DOUBLE  threshold,
INT  border_mode,
DOUBLE  value 
)

閾値ありゼロクロスフィルタ

閾値ありゼロクロスフィルタを実行します。 2次微分処理後の符号あり濃淡画像などにおいて、零交差点を検出します。

fie_zero_cross_thr.png

本関数は、 fnFIE_zero_cross() に対して閾値を指定できるように拡張したものです。 交差点を求めた画素間の変化量がこの閾値以上の場合のみ零交差点とします。 つまり閾値を0とした場合に、 fnFIE_zero_cross() と同じ意味となります。

零交差点と判定された画素の濃度値は color となり、それ以外の画素の濃度値は0となります。 ただし、出力画像の画素タイプがF_IMG_BINの場合、 color は無視されます。 零交差点と判定された画素の濃度値は1となります。

出力画像が F_IMG_UC8 型の場合、 color は単純キャストで整数に変換されます。 color が対象となる画素タイプの濃度値範囲を超えていた場合は、サチュレーション処理が行われます。
また、入力画像が整数型の場合、 threshold は単純キャストで整数に変換されます。 対象となる画素タイプの濃度値範囲を超えた場合も、サチュレーション処理は行われません。

入出力画像は以下の条件を満たす必要があります。

  • 入力画像の画素タイプは、F_IMG_S16、またはF_IMG_DOUBLEでなければなりません。
  • 出力画像の画素タイプは、F_IMG_BIN、またはF_IMG_UC8でなければなりません。
  • 入力画像と出力画像の画素タイプの組み合わせは、対象となるすべての組合せが可能です。
  • 入力画像と出力画像はサイズは同じでなければなりません。
  • 画像の幅、高さは3以上でなければなりません。
  • チャネル数は、共に1でなければなりません。
ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は0となります。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hsrc 入力画像(type:s16,double / ch:1)
[out] hdst 出力画像(type:bin,uc8 / ch:1)
[in] neib 4近傍/8近傍の指定。 4:4近傍 8:8近傍
[in] color エッジの際に入れる値
hdst の画素タイプが F_IMG_BIN の場合は無視されます
[in] threshold 変化量のための閾値(0以上)
変化量が閾値以上の場合にエッジとみなします
[in] border_mode ボーダーモード。下記のいずれかを指定
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値
border_mode が F_BORDER_VALUE の場合のみ使用されます。 その他のボーダーモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_zero_cross() , fnFIE_any_cross_threshold(), fnFIE_copy_border()
処理結果例:
  1. 入力画像
  2. fnFIE_LoG_2Dfilter() 処理後の画像
  3. fnFIE_zero_cross() 処理後の結果画像
  4. 2の画像を fnFIE_zero_cross_threshold() で処理した結果画像
なお、 fnFIE_any_cross_threshold() では、 threshold を4として処理をしています。 また、 fnFIE_LoG_2Dfilter() 処理後の画像は、見やすくするために加工してありますので注意してください。 適切な閾値を指定することで、閾値なしの任意値クロスフィルタに存在する余分な零交差点が消えています。
fie_zero_cross_thr2.png

INT FVALGAPI fnFIE_cyclic_averageMxN ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  lower,
DOUBLE  upper,
INT  size_m,
INT  size_n,
INT  border_mode,
DOUBLE  border_value 
)

画素値の周期性を考慮した平滑化フィルタ(M×N)

角度などの周期的データに対する平滑化フィルタを入力画像に適用し、出力画像に結果を出力します。
この関数は周期的データの循環を適切に扱います。 例えば、角度のように0〜360を1周期と指定し処理させた場合、10度と350度の角度の平滑化結果を0度として算出することが可能です。

出力画像の値域は半開区間で指定し [ lower , upper ) となります。
例えば、度数表記の角度の範囲を指定する場合は [0, 360) とします。
入力画像の値域は [ lower , upper ) である必要はなく、 範囲外の場合は画素値の周期 ( upper - lower ) をもとに関数内で適切に値が変換されます。

出力画像の値域の下限 lower は上限 upper より小さい必要があります。
画像の型が整数型(F_IMG_UC8, F_IMG_S16, F_IMG_US16)である場合、lowerupper は四捨五入して扱われます。
整数型の場合における lowerupper がとりうる値の範囲は型の値域に応じて制限されます。 値の範囲は下記の表の通りとなり、範囲を超える値が与えられた場合はエラーとなります。

画像型 lower の最小値 upper の最大値
F_IMG_UC8 0 256
F_IMG_S16 -32768 32768
F_IMG_US16 0 65536

フィルタサイズは任意(M×N)です。 フィルタのアンカー位置は、フィルタの中心となります。
フィルタサイズは下記の条件を満たしている必要があります。

  • フィルタの幅と高さが共に1以上の奇数である
  • フィルタのサイズは画像サイズ以下である

入力画像と出力画像は下記の条件を満たしている必要があります。

  • サイズ(幅・高さ)、チャネル数、画像の型が等しい
  • 画像の型は F_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE のいずれか

処理はチャネル毎に実行されます。

ボーダー処理モードがF_BORDER_NONEの時、

  • 画像の左右$ \lfloor \frac{M}{2} \rfloor$画素
  • 画像の上下$ \lfloor \frac{N}{2} \rfloor$画素

は処理されません。

ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, double )
[out] hdst 出力画像 ( type: uc8, s16, us16, double )
[in] lower 出力画像の値域の下限
[in] upper 出力画像の値域の上限。画素値の周期は( upper - lower )となる
[in] size_m フィルタの幅M(水平方向 1以上画像幅以下の奇数)
[in] size_n フィルタの高さN(垂直方向 1以上画像高さ以下の奇数)
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は,この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_distance_transform ( FHANDLE  hSrc,
FHANDLE  hDst,
INT  iMode 
)

2値画像の距離変換を行う

本関数は入力2値画像の距離変換を行って、距離画像を出力します。

距離定義は八近傍距離(chess-board distance)、四近傍(city-block distance)、 近似ユークリッド距離(approximate Euclidean distance)とユークリッド距離(Euclidean distance)の 4種類が実装されています。パラメータ iMode に 距離変換モード を指定することでて距離変換の種類を指定します。

各距離の定義は以下のようになります。

  • ユークリッド距離、近似ユークリッド距離
    ユークリッド距離は、最も基本的な距離定義であり、K 次元空間の物理距離と一致します。

    \[ d_{ij} = \sqrt{\left( x_{i} - x_{j} \right)^2+\left( y_{i} - y_{j} \right)^2} \]

  • 四近傍距離(市街地距離)
    四近傍距離は、加算、減算のみからなっており、高速に大量の距離計算を乗算性能の劣るコンピュータで行う場合などにむいています。

    \[ d_{ij} = | x_{i} - x_{j} | + | y_{i} - y_{j} | \]

  • 八近傍距離(チェス盤距離)
    四近傍距離が、各特徴軸にそった長さの和で距離を定義しているのに対し、八近傍距離は各特徴軸にそった長さの最大値で定義します。

    \[ d_{ij} = \max \left(| x_{i} - x_{j} | , | y_{i} - y_{j} | \right) \]

以下に2値画像に対して四近傍距離によって距離変換を行った結果例を示します。 左図が入力2値画像、右図が出力画像となります。

fie_distance_transform1.png

四近傍距離による距離変換

八近傍、四近傍と近似ユークリッド距離変換は Shin&Wu (2004) の論文を参考して作成しました。 この近似ユークリッド距離変換のアルゴリズムには欠点があるため、計算結果には若干誤差が発生します。 ユークリッド距離変換(Euclidean distance)は Tomio Hirata (1996) の論文を参考して作成しました。 これには誤差は発生しません。近似ユークリッド距離とユークリッド距離計算の速度は入力画像によって 変わりますが、ほぼ同じです。

入力画像の型は F_IMG_BIN でなければいけません。出力画像の型は F_IMG_DOUBLE と F_IMG_US16 の二種類が使用可能です。 入力と出力画像の横縦サイズは同じでなければなりません。また、チャネル数は入出力共に1でなければいけません。 計算結果のオーバーフローを防止するため、画像の横幅、及び縦幅が共に 65535 を超えている場合はエラーとなり、 F_ERR_INVALID_IMAGE を返します。

引数:
[in] hSrc 入力画像のハンドル( type: bin / ch: 1 )
[out] hDst 出力画像のハンドル( type: us16, double / ch: 1 )
[in] iMode 距離変換モード f_distance_transform_mode
  • F_DT_CITY_BLOCK 4近傍距離
  • F_DT_CHESS_BOARD 8近傍距離
  • F_DT_EUCLIDEAN_APPROXI 近似ユークリッド距離
  • F_DT_EUCLIDEAN_EXACT ユークリッド距離
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
  • 入力画像の型がF_IMG_BINではない
  • 出力画像の型がF_IMG_DOUBLE、或いはF_IMG_US16ではない
  • 入力と出力画像の幅、または高さが違う
  • 入力と出力画像のチャネル数が1ではない
  • 入力と出力画像の幅と高さが共に65535を超えている
F_ERR_INVALID_PARAM iMode に不正な値が入力された
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参考文献:
  • Tomio Hirata, "A unified linear-time algorithm for computing distance maps", Information Processing Letters, VOl. 58 (1996), 129 - 133
  • Frank Y. Shih and Yi-Ta Wu, "Fast Euclidean distance transformation in two scans using a 3x3 neighborhood", Computer Vision and Image Understanding, VOl. 93 (2004), 195- 205
  • Donald G. Bailey, "An Efficient Euclidean Distance Transform", IWCIA 2004, LNCS 3322, ( 2004 ), 394 - 408
  • 櫻井敦史、"アルゴリズム解説:距離変換及びそれを用いたモルフォロジー演算", http://www.hirata.nuee.nagoya-u.ac.jp/~sakurai/AD/AD.html

処理結果例:
fie_distance_transform2.png

各距離による距離変換例

INT FVALGAPI fnFIE_gabor ( FHANDLE  hSrc,
FHANDLE  hDst,
DOUBLE  sigma,
DOUBLE  wavelen,
DOUBLE  orient,
INT  filter_mode,
INT  border_mode,
DOUBLE  border_val 
)

ガボール フィルタ

ガウス関数 と 正弦・余弦関数 の積として定義された 以下の様なフィルタカーネルを入力画像に畳み込み演算して出力します。

\begin{eqnarray*}{ g_{\sigma, \lambda, \theta}(x,y) &=& W_{\sigma}(x,y) \cdot c_{\lambda,\theta}(x,y)\\ &=& \frac{1}{2\pi\sigma^2}exp\left(-\frac{x^2+y^2}{2\sigma^2}\right) \cdot exp\left(i\frac{2\pi}{\lambda}(x cos\theta + y sin \theta)\right)\\ \end{eqnarray*}{

ここで $\sigma$ は ガウス関数 の標準偏差、$\lambda$ は 正弦・余弦関数の波長、そして $\theta$ は フィルタカーネルの方位となります。

このフィルタカーネルは 任意の周波数成分を抽出する機能をもちます。

このフィルタカーネルは 複素数であり、その実部 と 虚部 はそれぞれ以下のような形となります。

  • 実部
    fie_gabor_re_1d.png

    fie_gabor_re.png

  • 虚部
    fie_gabor_im_1d.png

    fie_gabor_im.png

フィルターモードについて
ガボールフィルタの処理結果は 実部 と 虚部 から成る 複素数として得られますが、 本関数ではパラメータ filter_mode の指定により下記のような出力を行います。
  • filter_mode = 0
    処理結果の 実部 のみを出力します。
  • filter_mode = 1
    処理結果の 虚部 のみを出力します。
  • filter_mode = 2
    処理結果の 実部 と 虚部 の 自乗和の平方根 を出力します。
境界部分処理について
本関数では局所領域の情報を使って処理を行うため、ボーダー処理モードに F_BORDER_NONE を指定した場合、 画像の周囲に処理されない (出力が行われない) 領域が出来ます。 ボーダー処理モードに F_BORDER_NONE 以外を指定した場合、内部でボーダー拡張処理が行われ 画像の全面に対して 処理が行われます。 ボーダー処理モードの詳細な仕様については fnFIE_copy_border() を参照して下さい。
入出力画像について
入力画像と出力画像の 幅、高さ、チャネル数 は同じでなければなりません。
入力画像と出力画像の 画像型 は同じでなければなりません。
但し、入力画像が F_IMG_UC8、F_IMG_S16、F_IMG_US16 の場合に限り 出力画像として F_IMG_FLOAT を指定することが出来ます。
  出力画像型
UC8 S16 US16 FLOAT DOUBLE
入力画像型 UC8 ○ ※1 × × ×
S16 × × ×
US16 × × ○ ※1 ×
FLOAT × × × ×
DOUBLE × × × ×
○:可 ×:不可
  • ※1. 結果がマイナス値の場合は絶対値を出力します
引数:
[in] hSrc 入力画像 ( type: uc8, s16, us16, float, double )
[out] hDst 出力画像 ( type: uc8, s16, us16, float, double )
[in] sigma ガボールフィルタの標準偏差 $\sigma$ (単位 : pixel, 0.4 <= sigma)
[in] wavelen ガボールフィルタの波長 $\lambda$ (単位 : pixel, 0 < wavelen)
[in] orient ガボールフィルタの方位 $\theta$ (単位 : radian )
[in] filter_mode フィルターモード. 下記のいずれかを指定.
  • 0 : 実部 を出力.
  • 1 : 虚部 を出力.
  • 2 : 実部 と 虚部 の 自乗和の平方根 を出力.
[in] border_mode ボーダー処理モード. 下記のいずれかを指定.
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_val ボーダー濃度値.
border_mode が F_BORDER_VALUE の場合のみ使用されます. その他のモードの場合、この値は無視されます.
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下の結果画像は、同じ入力画像に対し パラメータ orient ($\theta$) のみを変えて実行させた場合のものです。
また、パラメータ filter_mode の設定は 0 (実部を出力) となっています。

結果画像 ($\lambda$= 6, $\sigma$= 6, $\theta$= $\pi$/2)    
fie_gabor_img_src.png

入力画像

    結果画像 ($\lambda$= 6, $\sigma$= 6, $\theta$= $\pi$/4)
fie_gabor_img_dst_deg95.png
fie_gabor_img_dst_deg45.png
 
結果画像 ($\lambda$= 6, $\sigma$= 6, $\theta$= -$\pi$/4) 結果画像 ($\lambda$= 6, $\sigma$= 6, $\theta$= 0)
fie_gabor_img_dst_deg135.png
fie_gabor_img_dst_deg0.png

INT FVALGAPI fnFIE_gaussian_approximation ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  sigma,
INT  derivative_x,
INT  derivative_y,
INT  border_mode,
DOUBLE  border_value 
)

近似ガウシアン フィルタ

2 次元のガウシアン平滑化を行います。
下式のようなガウシアン関数による畳み込みと理論上等価な処理を 少ない演算量で行うことにより、 従来のガウシアンフィルタ関数 ( fnFIE_gaussian_derivative_2Dfilter() 等) に近似した結果を得つつ高速化効果が期待できます。 sigma の値が大きいほど、従来のガウシアンフィルタ関数に対する高速化効果は大きく現れます。

\[ g(x,y) = \frac{1}{2\pi\sigma^{2}} \exp\left( -\frac{x^{2}+y^{2}}{2\sigma^{2}} \right) \]

ここで $\sigma$ は ガウシアン関数 の標準偏差となります。

微分次数について
微分次数( derivative_x 及び derivative_y ) に 1 または 2 を指定した場合、ガウシアン平滑化処理の結果に方向微分が施されます。
この時 符号無し型(F_IMG_UC8 または F_IMG_US16) の出力画像に対しては、微分結果の絶対値が出力されます。
境界部分処理について
本関数では局所領域の情報を使って処理を行うため、ボーダー処理モードに F_BORDER_NONE を指定した場合、 画像の周囲に処理されない (出力が行われない) 領域が出来ます。 ボーダー処理モードに F_BORDER_NONE 以外を指定した場合、内部でボーダー拡張処理が行われ 画像の全面に対して 処理が行われます。 ボーダー処理モードの詳細な仕様については fnFIE_copy_border() を参照して下さい。
入出力画像について
入力画像と出力画像の 画像型、幅、高さ、チャネル数 は同じでなければなりません。
引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, double )
[out] hdst 出力画像 ( type: uc8, s16, us16, double )
[in] sigma ガウシアン関数の標準偏差 (単位 : pixel, 1.0 <= sigma)
[in] derivative_x X 方向処理時の微分次数 (0, 1, 2)
[in] derivative_y Y 方向処理時の微分次数 (0, 1, 2)
[in] border_mode ボーダー処理モード. 下記のいずれかを指定.
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値.
border_mode が F_BORDER_VALUE の場合のみ使用されます. その他のモードの場合、この値は無視されます.
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_gaussian_2Dfilter(), fnFIE_gaussian_derivative_2Dfilter()
参考文献:
  • Heckbert, P. S., " Filtering by repeated integration"

処理結果例:
以下の例は 本関数 と 従来のガウシアンフィルタ関数 の処理結果を対比させたものです。
各結果画像は それぞれ下記関数の実行結果として得られるものとなっています。

近似 版 ... fnFIE_gaussian_approximation()
FIR 版 ... fnFIE_gaussian_derivative_2Dfilter() ※ iMode = 0
IIR 版 ... fnFIE_gaussian_derivative_2Dfilter() ※ iMode = 1
  • 入力画像
    floppy1.png

  • 結果画像
    近似FIRIIR
    X 方向微分次数 = 0
    Y 方向微分次数 = 0

    標準偏差 = 3.0
    fie_gauss_approx_s3.png
    fie_gauss_approx_ref_fir_s3.png
    fie_gauss_approx_ref_iir_s3.png
    X 方向微分次数 = 0
    Y 方向微分次数 = 0

    標準偏差 = 5.0
    fie_gauss_approx_s5.png
    fie_gauss_approx_ref_fir_s5.png
    fie_gauss_approx_ref_iir_s5.png
    X 方向微分次数 = 1
    Y 方向微分次数 = 1

    標準偏差 = 1.5

    fie_gauss_approx_d1.png
    fie_gauss_approx_ref_fir_d1.png
    fie_gauss_approx_ref_iir_d1.png
    X 方向微分次数 = 2
    Y 方向微分次数 = 2

    標準偏差 = 1.5

    fie_gauss_approx_d2.png
    fie_gauss_approx_ref_fir_d2.png
    fie_gauss_approx_ref_iir_d2.png
    ※: 微分次数が 0 以外の結果画像は F_IMG_DOUBLE 型で処理を行った後、視認しやすいように濃度値のスケーリングを行った画像です。

INT FVALGAPI fnFIE_gaussian_1Dfilter_iir ( FHANDLE  fhSrc,
FHANDLE  fhDst,
DOUBLE  dSigma,
INT  iNDerivative,
BOOL  bIsVertical 
)

gaussian1D filter(recursive(IIR)版)

X方向、またはY方向にgaussian filterを施します。impulse responseがgauss関数

\[f(x) = \frac{1}{\sqrt{2\pi}\sigma}\exp\left(\frac{-x^{2}}{2\sigma^{2}}\right) \]

やその(1次、2次)微分関数の近似になるように設計されています。 参考文献"Recursive Gaussian Derivative Filters"(Young,van Vliet)を元に実装しました。 端における処理は、端の画素値を同じ値で延長する方式にしてあり、処理結果は画像全面で得られます。 微分はgaussian filterの結果に方向微分を行う方式で実装しています。

1次微分: $\left(g(i+1)-g(i-1)\right)/2$
2次微分: $g(i+1)-2g(i)+g(i-1)$

微分する場合( iNDerivative>0 )、画像の端1画素が処理されません。 X方向の場合、処理されない位置は x[0], x[画像幅-1] で、Y方向は y[0], y[画像高さ-1] です。 処理されない画素については、入力された fhDst の値がそのまま残ります 。 このため、微分する場合は bIsVertical == FALSE のとき(画像幅<3) bIsVertical == TRUE のとき(画像高さ<3) の場合は何も処理されずに終了します。

入出力画像の型にかかわらず、内部計算はDOUBLEにて実行します。 入出力画像の型が F_IMG_UC8 又は F_IMG_US16 の場合、処理結果の絶対値を出力します。 また F_IMG_DOUBLE 以外の型では、各型の上下限値にてサチュレーション処理を行います。 (F_IMG_UC8, F_IMG_US16 の場合は、絶対値を取った後にサチュレーション処理を行います)

6σ+1>>画像サイズ の時でも、理論値の近似Filterとなることが分かっていますが、精度がどの程度かは不明であるので、そのような使い方は推奨しません。 現在、1<=σ<=4で参考文献の方法(q=σ/2)より誤差が小さくなるように実装してあります。

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] dSigma gaussian filterのσ(1.0以上)
[in] iNDerivative 微分次数(0,1,2)
[in] bIsVertical TRUE:y方向処理 FALSE:x方向処理
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_INVALID_PARAM パラメータ異常
  • dSigma<1.0
  • iNDerivative<0
  • iNDerivative>2 または bIsVertical!=TRUE && bIsVertical!=FALSE
  • iNDerivative>0 かつ bIsVertical==FALSE のとき 画像幅<3
  • iNDerivative>0 かつ bIsVertical==TRUE のとき 画像高さ<3
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参考文献:
  • "Recursive Gaussian Derivative Filters"(Young,van Vliet)

INT FVALGAPI fnFIE_gaussian_1Dfilter_conv ( FHANDLE  fhSrc,
FHANDLE  fhDst,
DOUBLE  dSigma,
INT  iNDerivative,
BOOL  bIsVertical 
)

gaussian1D filter(convolution(FIR)版)

X方向、またはY方向にgaussian filterを施します。 convolutionのカーネル関数がガウス関数であるようなフィルタです。 double版は計算誤差を除けば理論値 $ f(x) = \frac{1}{\sqrt{2\pi}\sigma}\exp\left(\frac{-x^{2}}{2\sigma^{2}}\right) $ です。 以下、N=3σ(小数点以下切り上げ),x(i):注目点からi離れたピクセル値とすると、コンボリューションは

\[ \frac{1}{\sqrt{2\pi}\sigma}\sum^{N}_{i=-N}{\exp\left(\frac{-i^2}{2\sigma^2}\right)x(i)} \]

\[ \frac{1}{\sqrt{2\pi}\sigma}\sum^{N}_{i=-N}{\frac{i}{\sigma^2}\exp\left(\frac{-i^2}{2\sigma^2}\right)x(i)} \]

\[ \frac{1}{\sqrt{2\pi}\sigma}\sum^{N}_{i=-N}{\frac{\sigma^2-i^2}{\sigma^4}\exp\left(\frac{-i^2}{2\sigma^2}\right)x(i)} \]

とります。

UCHAR版は係数を固定小数点化し、INTでconvolutionを行っています。(現在固定小数点の実装はσ>=0.4で最適化してあります。σの値によってはすべての係数が0となってしまうこともあるので注意。) 画像の端N画素は処理しません。X方向の場合、処理されない位置はx[0]〜x[N-1],x[iWidth-N-2]〜x[iWidth-1]で、入力された fhDst の値がそのまま残ります(x[i]:原点からi離れた画素)。Y方向も同様。 UCHAR,USHORTの場合、マイナス値は絶対値で正の値に変換しています。 USHORT,SHORT版の内部計算はDOUBLEで行い、出力結果は四捨五入された値です。 DOUBLEを除く各型の上下限値でサチュレーションを行っています。(UCHAR,USHORT型は絶対値に変換した後サチュレーション)

2N+1>画像サイズの時 fhDst はなにも処理されないで終了します。 入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

ちなみに1次微分の場合、すべての係数はガウス微分関数値の符号を変えた値になっています。

引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double)
[out] fhDst 処理結果画像( type: uc8, s16, us16, double)
[in] dSigma gaussian filterのσ(0.6以上)
[in] iNDerivative 微分次数(0,1,2)
[in] bIsVertical 処理方向
  • TRUE: y方向処理
  • FALSE: x方向処理
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_INVALID_PARAM パラメータ異常。以下の何れか。
  • dSigma < 0.6
  • iNDerivative < 0
  • iNDerivative > 2
  • bIsVertical != TRUE && bIsVertical != FALSE
F_ERR_NOMEMORY メモリ確保失敗
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_gaussian_1Dfilter ( FHANDLE  fhSrc,
FHANDLE  fhDst,
DOUBLE  dSigma,
INT  iNDerivative,
BOOL  bIsVertical,
INT  iMode,
INT  border_mode,
DOUBLE  value 
)

gaussian1D filter

1次元のガウスフィルタ。 fnFIE_gaussian_1Dfilter_iir()fnFIE_gaussian_1Dfilter_conv() のラッパー関数です。

iMode で Convolution と IIR を選択できます。(選択方法はパラメータ参照) σの下限値や端の処理が iMode により異なるので注意して下さい。

ボーダー処理について
iMode が iir の時
ボーダー処理モードがF_BORDER_NONEの時、ボーダー拡張せず fnFIE_gaussian_1Dfilter_iir() をそのまま実行します。 ボーダー処理モードがF_BORDER_NONE以外の時、微分次数に依らず入力画像を指定のモードで上下または左右に1画素分ボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られる。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照すること。
iMode が convolution の時
ボーダー処理モードがF_BORDER_NONEの時、ボーダー拡張せず fnFIE_gaussian_1Dfilter_conv() をそのまま実行します。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードで上下または左右に3σ画素(小数点以下切り上げ)分ボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照すること。
iModeの違いについて
IIRはconvolutionよりも近似性能が悪いが、σが1以上の時、計算回数がconvolutionよりも少なくなります。 (実行速度が逆転するのはσが1よりもっと大きな値の時です)
σが十分大きな値の時
  • IIR:( 精度:低、速度:速い )
  • FIR:( 精度:高、速度:遅い )
σが十分大きな値より小さい値の時
  • IIR:( 精度:低、速度:遅い )
  • FIR:( 精度:高、速度:速い )
画像について
入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。
その他
その他の仕様はラップしている各関数( fnFIE_gaussian_1Dfilter_iir() , fnFIE_gaussian_1Dfilter_conv() )を参照して下さい。
引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] dSigma gaussian filterのσ( iMode = 0 のとき0.6以上, iMode = 1 のとき1.0以上)
[in] iNDerivative 微分次数(0,1,2)
[in] bIsVertical 微分方向
  • TRUE:y方向処理
  • FALSE:x方向処理
[in] iMode 処理モード
  • 0:convolution
  • 1:iir
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ確保失敗
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下の結果画像は、DOUBLE型画像で処理を行った後、視認しやすいように濃度値のスケーリングを行った画像です。
floppy1.png

入力画像

fie_gaussian_x.png

処理結果画像:dSigma=3.0, iNDerivative=0, bIsVertical=FALSE

fie_gaussian_dx.png

処理結果画:dSigma=3.0, iNDerivative=1, bIsVertical=FALSE

fie_gaussian_dxx.png

処理結果画:dSigma=3.0, iNDerivative=2, bIsVertical=FALSE

INT FVALGAPI fnFIE_gaussian_2Dfilter ( FHANDLE  fhSrc,
FHANDLE  fhDst,
DOUBLE  dSigma,
INT  iMode,
INT  border_mode,
DOUBLE  value 
)

gaussian2D filter

2次元のガウスフィルタ。ガウスフィルタは分離可能フィルタのため、X方向のgaussian 1Dfilterを施した後、Y方向のgaussian 1Dfilterを施して結果を出力している。 UCHAR,USHORT,SHORT版はすべてDOUBLEにコピーしDOUBLE版1Dフィルタを使って処理して、出力結果は四捨五入された値になります。 IIRモードではUCHAR,USHORT型のときのマイナス値を絶対値に変換しています。(マイナス値の可能性があるので) DOUBLEを除く各型の上下限値でサチュレーションを行っています。(UCHAR,USHORT型は絶対値に変換した後サチュレーション)

iMode で ConvolutionとIIRを選択できます。 σの下限値や端の処理が iMode により異なるので注意して下さい。 その他、各モードで fnFIE_gaussian_1Dfilter() の基本仕様を引き継いでいます。

ボーダー処理について
iMode がiirの時 border_mode は無視されます。(端の処理については fnFIE_gaussian_1Dfilter_iir() 参照)
iMode がconvolutionの時
ボーダー処理モードがF_BORDER_NONEの時は、出力画像の上下左右の端3σ画素分(小数点以下切り上げ)は処理されない。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードで上下左右に3σ画素(小数点以下切り上げ)分ボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい 。
iModeの違いについて
IIRはconvolutionよりも近似性能が悪いが、σが1以上の時、計算回数がconvolutionよりも少なくなる。(実行速度が逆転するのはσがもっと大きな値の時である)
σが十分大きな値の時
  • IIR:( 精度:低、速度:速い )
  • FIR:( 精度:高、速度:遅い )
σが十分大きな値より小さい値の時
  • IIR:( 精度:低、速度:遅い )
  • FIR:( 精度:高、速度:速い )
画像について
入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。
引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] dSigma gaussian filterのσ( iMode = 0 のとき0.6以上, iMode = 1 のとき1.0以上)
[in] iMode 処理モード
  • 0:convolution
  • 1:iir
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_INVALID_PARAM パラメータ異常
  • border_mode 異常
  • iMode < 0 || iMode > 1
  • bIsVertical != TRUE && bIsVertical != FALSE
  • iMode == 0 && dSigma < 0.6
  • iMode == 1 && dSigma < 1
F_ERR_NOMEMORY メモリ確保失敗
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_gaussian2d.png

処理結果画像: dSigma=5.0

INT FVALGAPI fnFIE_gaussian_derivative_2Dfilter ( FHANDLE  fhSrc,
FHANDLE  fhDst,
DOUBLE  dSigma,
INT  iNDerivativeX,
INT  iNDerivativeY,
INT  iMode,
INT  border_mode,
DOUBLE  value 
)

derivative gaussian2D filter

2次元のガウス微分フィルタ。X方向で iNDerivativeX 次微分 gaussian 1Dfilter を施した後、Y方向で iNDerivativeY 次微分 gaussian 1Dfilter を施した結果を出力します。 UCHAR,USHORT,SHORT版はすべてDOUBLEにコピーしDOUBLE版1Dフィルタを使って処理して、出力結果は四捨五入された値になります。 画像がUCHAR,USHORT型のときのマイナス値を絶対値に変換しています。 DOUBLEを除く各型の上下限値でサチュレーションを行っています。(UCHAR,USHORT型は絶対値に変換した後サチュレーション)

iMode でConvolutionとIIRを選択できます。 σの下限値や端の処理が iMode により異なるので注意して下さい。 その他、各モードで fnFIE_gaussian_1Dfilter() の基本仕様を引き継いでいます。

ボーダー処理について
iMode がiirの時
ボーダー処理モードがF_BORDER_NONEの時の端の処理については各微分方向処理が fnFIE_gaussian_1Dfilter_iir() に従います。 ボーダー処理モードがF_BORDER_NONE以外の時、微分次数に依らず入力画像を指定のモードで上下左右に1画素分ボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られる。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。
iMode がconvolutionの時
ボーダー処理モードがF_BORDER_NONEの時は、出力画像の上下左右の端3σ画素分は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードで上下左右に3σ画素分ボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。
iModeの違いについて
IIRはconvolutionよりも近似性能が悪いが、σが1以上の時、計算回数がconvolutionよりも少なくなります。(実行速度が逆転するのはσがもっと大きな値の時である) また、IIRは微分する場合、微分しない場合よりも近似性能が悪くなります。
σが十分大きな値の時
  • IIR:( 精度:低、速度:速い )
  • FIR:( 精度:高、速度:遅い )
σが十分大きな値より小さい値の時
  • IIR:( 精度:低、速度:遅い )
  • FIR:( 精度:高、速度:速い )
画像について
入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。
引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] dSigma gaussian filterのσ( iMode = 0 のとき0.6以上, iMode = 1 のとき1.0以上)
[in] iNDerivativeX X方向処理の時の微分次数(0,1,2)
[in] iNDerivativeY Y方向処理の時の微分次数(0,1,2)
[in] iMode 処理モード
  • 0:convolution
  • 1:iir
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_INVALID_PARAM パラメータ異常
  • border_mode 異常
  • dSigma が異常値
  • iMode が異常値
  • !( 0 <= iNDerivativeX <= 2 )
  • !( 0 <= iNDerivativeY <= 2 )
F_ERR_NOMEMORY メモリ確保失敗
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下の結果画像は、DOUBLE型画像で処理を行った後、視認しやすいように濃度値のスケーリングを行った画像です。
floppy1.png

入力画像

fie_gaussian2d_xy.png

処理結果画像:dSigma=1.0, iNDerivativeY=0, iNDerivativeX=0

fie_gaussian2d_dxdy.png

処理結果画:dSigma=1.0, iNDerivativeX=1, iNDerivativeY=1

fie_gaussian2d_dxxdyy.png

処理結果画:dSigma=1.0, iNDerivativeX=2, iNDerivativeY=2

INT FVALGAPI fnFIE_LoG_2Dfilter ( FHANDLE  fhSrc,
FHANDLE  fhDst,
DOUBLE  dSigma,
INT  iMode,
INT  border_mode,
DOUBLE  value 
)

Laplacian of Gaussian filter

Laplacian of Gaussianフィルタ。

\[ \nabla^2G(x,y)=-\frac{1}{2\pi\sigma^4}\left(2-\frac{x^2+y^2}{\sigma^2}\right)\exp\left(-\frac{x^2+y^2}{2\sigma^2}\right) \]

画像がUCHAR,USHORT型のときのマイナス値を絶対値に変換しています。 DOUBLEを除く各型の上下限値でサチュレーションを行っています。(UCHAR,USHORT型は絶対値に変換した後サチュレーション)

ボーダー処理について
iMode がiirの時
ボーダー処理モードがF_BORDER_NONEの時、出力画像の上下左右の端1画素分は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードで上下左右に1画素分ボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。
iMode がconvolutionの時
ボーダー処理モードがF_BORDER_NONEの時は、出力画像の上下左右の端3σ画素分は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードで上下左右に3σ画素分ボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。
画像について
入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。
引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] dSigma gaussian filterのσ( iMode = 0 のとき0.6以上, iMode = 1 のとき1.0以上)
[in] iMode 処理モード
  • 0:convolution
  • 1:iir
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_INVALID_PARAM パラメータ異常
  • border_mode 異常
  • dSigma が異常値
  • iMode が異常値
F_ERR_NOMEMORY メモリ確保失敗
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下の結果画像は、DOUBLE型画像で処理を行った後、視認しやすいように濃度値のスケーリングを行った画像です。
floppy1.png

入力画像

fie_LoG.png

処理結果画像:dSigma=1.0

INT FVALGAPI fnFIE_DoG_2Dfilter ( FHANDLE  fhSrc,
FHANDLE  fhDst,
DOUBLE  dSigma1,
DOUBLE  dSigma2,
INT  iMode,
INT  border_mode,
DOUBLE  value 
)

Difference of Gaussian 2D filter

σ1( dSigma1 )によるガウシアン結果からσ2( dSigma2 )によるガウシアン結果を引いた結果を出力します。 LoGの近似として用いられることがあります。 処理対象画像がUCHAR,USHORT型のとき、結果値がマイナス値となる場合は絶対値を出力しています。 DOUBLEを除く各型の上下限値でサチュレーションを行っています。(UCHAR,USHORT型は絶対値に変換した後サチュレーション)

ボーダー処理について
iMode がiirの時 border_mode は無視されます。
iMode がconvolutionの時
ボーダー処理モードがF_BORDER_NONEの時は、出力画像の上下左右の端3σ画素分は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードで上下左右に3σ画素分ボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。
画像について
入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。
引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] dSigma1 gaussian filterのσ( iMode = 0 のとき0.6以上, iMode = 1 のとき1.0以上)
[in] dSigma2 gaussian filterのσ( iMode = 0 のとき0.6以上, iMode = 1 のとき1.0以上, かつ dSigma1 < dSigma2 )
[in] iMode 処理モード
  • 0:convolution
  • 1:iir
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_INVALID_PARAM パラメータ異常
  • border_mode 異常
  • dSigma が異常値
  • iMode が異常値
  • dSigma1 >= dSigma2
F_ERR_NOMEMORY メモリ確保失敗
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下の結果画像は、DOUBLE型画像で処理を行った後、視認しやすいように濃度値のスケーリングを行った画像です。
floppy1.png

入力画像

fie_DoG.png

処理結果画像: dSigma1=0.6, dSigma2=2.0

INT FVALGAPI fnFIE_harris_filter ( FHANDLE  fhSrc,
FHANDLE  fhDst,
DOUBLE  dSigma,
DOUBLE  dK 
)

harris corner detection filter

各画素でHarris特徴量(コーナー強度)を求めるフィルタ。 各チャネル毎に処理を行います。

【コーナー強度について】
各画素でコーナー強度(式1のHarris)の計算を行います。
式1

\[ Harris = det(C) - k \times trace(C)^2 \]

式2

\[ C = G \left( \begin{array}{cc} f_{x}^2 & f_{x}f_{y} \\ f_{x}f_{y} & f_{y}^2 \end{array} \right) \]

ただし
k: 定数
G: ガウシアンフィルタによる平滑化
コーナーの位置(座標)を求めるにはコーナー強度が正の極大値となる画素を探せば良いです。
dK の値は任意ですが、harrisの論文では 0.04 が用いられています。
入力画像と出力画像は同じ幅、高さ、チャネル数、でなければなりません。
引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: double )
[in] dSigma 式2のガウシアンフィルタのσ(0.6以上)
[in] dK 式1のK
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下に示す処理結果は、 画素タイプをDOUBLE型からUC8型へ変換して表示しています。 その際に、正の極大値を255、0を127となるように正規化をしています。
なお、指定したパラメータは以下の通りとなります。
  • dSigma = 1.0
  • dK = 0.04
palette.png

入力画像

fie_harris.png

処理結果画像

INT FVALGAPI fnFIE_kernel_filter ( FHANDLE  hsrc,
FHANDLE  hdst,
F_FILTER_KERNEL_T kernel,
INT  border_mode,
DOUBLE  border_value 
)

任意カーネルフィルタ

パラメータ kernel による2次元畳み込み処理を行います。 座標(x,y)における入力画像の濃度値を G(x,y) 、カーネルの値をK(i,j) と定義すると、 出力画像の濃度値は

\[ dst_{(x,y)} = \frac{1}{denom}\sum^{H-Ay-1}_{j=-Ay}\sum^{W-Ax-1}_{i=-Ax}K_{(i,j)}G_{(x+i,y+j)} \]

但し、

  • H:kernel->size_y
  • W:kernel->size_x
  • Ax:kernel->anchor_x
  • Ay:kernel->anchor_y
  • denom:kernel->denom
で定義されます。

整数型での演算
画像の型が整数型(us8, s16, us16)の場合は、計算時間を減らすため、計算をINTで行なっています。 このとき、カーネルの値も事前にDOUBLEからINTに変換してから演算を行うため、 カーネルの値は整数値に変換できるよう、適切にスケーリングされている必要があります。 kernel->denom の値も同様に整数に変換して扱われます。 (DOUBLEからINTへの変換には、 fnFIE_d4i5() を使用して、四捨五入を行います。)
たとえば、1x3 のカーネルに [-0.1 -0.2 -0.1] を設定した場合、これを四捨五入して 整数とすると、[0 0 0] となってしまうため、結果は全て0になります。
また、カーネルの値があまりに大きい場合は演算途中でオーバーフローが発生するため、 カーネルの値は下式の条件を満たしている必要があります。 もし、下式の条件が満たされない場合は、オーバーフローが発生し、そのときの出力結果は不定です。

\[ \sum^{H-Ay-1}_{j=-Ay}\sum^{W-Ax-1}_{i=-Ax}K_{(i,j)}G_{(x+i,y+j)} < 2^{31}-1 \]

なお、最終的な計算結果(積和した後、 denom の値で割った値)が画像型の値有効範囲 (たとえばF_IMG_UC8なら0〜255)を超える場合は、その型の有効な値範囲で飽和処理が行われます。
境界部分処理について
画像の周囲画素において、指定されたカーネルがはみ出す部分は、正しく値を求める事が出来ません。 しかし、本関数では fnFIE_copy_border() 関数を使用し、入力画像を拡張することで、 擬似的に出力できるようになっています。 これは border_mode 及び border_value パラメータにより制御されます。 border_mode パラメータにF_BORDER_NONEを指定した場合は、この拡張処理を行わず、 カーネルがはみ出す部分の出力画像の画素には値を書き込みません(元の値が保持される)。 F_BORDER_NONE以外を指定した場合には、処理前に fnFIE_copy_border() 関数を実行し、 入力画像をはみ出す分だけ拡張した後にフィルタ処理を行います。 このため、本来はカーネルがはみ出す部分の値も擬似的に計算され、結果値が格納されます。 なお border_mode , border_value は、どちらも fnFIE_copy_border() 関数に そのまま渡されるパラメータです。値の意味については fnFIE_copy_border() 関数を参照して下さい。
引数:
[in] hsrc 入力画像ハンドル。(type :uc8, s16, us16, double)
[out] hdst 出力先画像ハンドル。(type: uc8, s16, us16, double)
入力画像と同じサイズ、タイプ、チャネル数で有ること。
[in] kernel カーネル指定構造体のポインタ。
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM パラメータエラー
F_ERR_INVALID_IMAGE 不正な画像が渡された(入力と出力が合わない等)
F_ERR_NOMEMORY メモリ不足により異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下に処理結果を示します。 カーネルは、5×5の平均化フィルタ、およびX方向のソーベルフィルタとして設定をしています。 なお、5×5のX方向のソーベルフィルタは、以下の通りです。

\[ f_{x} = \left[ \begin{array}{ccccc} 5 & 4 & 0 & -4 & -5 \\ 8 & 10 & 0 & -10 & -8 \\ 10 & 20 & 0 & -20 & -10 \\ 8 & 10 & 0 & -10 & -8 \\ 5 & 4 & 0 & -4 & -5 \\ \end{array} \right] \]

floppy1.png

入力画像

fie_average5x5.png

処理結果画像:5×5平均化フィルタ

fie_sobel5x5.png

処理結果画:5×5ソーベルフィルタ

INT FVALGAPI fnFIE_laplacian ( FHANDLE  fhSrc,
FHANDLE  fhDst,
INT  iCase,
INT  border_mode,
DOUBLE  value 
)

laplacian filter

laplacian filterを施します。 次のようなマトリックスによる3×3の線形フィルタを施します。

	iCase : 0
	[0][ 1][0]
	[1][-4][1]
	[0][ 1][0]

	(div : 1)
	iCase : 1
	[1][ 1][1]
	[1][-8][1]
	[1][ 1][1]
	(div : 1)
	

なお、フィルタのアンカー位置は、フィルタの中心となります。

画像がUCHAR,USHORT型のときのマイナス値を絶対値に変換しています。 DOUBLEを除く各型の上下限値でサチュレーションを行っています。(UCHAR,USHORT型は絶対値に変換した後サチュレーション)

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

ボーダー処理について
ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照してください。
引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] iCase フィルタ選択(0 or 1)
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_INVALID_PARAM パラメータ異常
  • iCase != 0 || iCase != 1
  • border_mode 異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_laplacian.png

処理結果画像

INT FVALGAPI fnFIE_meanshift_filter ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  hs,
DOUBLE  hr,
INT  max_iter,
DOUBLE  tol_coef 
)

Mean-Shift 法による平滑化フィルタ

Mean-Shift 法を用いて、画像をエッジ保存平滑化します。

入力画像と出力画像は、下記の条件を満たしている必要があります。

  • 入力画像と出力画像のタイプは同じである
  • 入力画像と出力画像の幅と高さは同じである
  • 入力画像と出力画像のチャネル数は同じである
画像のタイプが F_IMG_DOUBLE の場合を除き、小数点以下は四捨五入されます。

処理時間とパラメータについて
Mean-Shift 法による画像の平滑化では、 反復処理によって、複数の画素を hs , hr によって決定される収束点へ近づけていきます。
計算量が多く、処理に多くの時間を必要とするので利用には注意してください。
hs , hr は、どの程度、画像を平滑化するのかを決定するパラメータで、 max_iter , tol_coef は、処理時間短縮のために、どの程度、誤差を許容し早期に処理を打ち切るかを決定するパラメータです。
パラメータを変更することによる影響を以下に示します。
  • hs が小さいとき、平滑化の効果は小さいですが、処理時間は比較的かかりません。
    一方、 hs が大きいとき、同じ色に平滑化される候補の座標上の範囲が広がり、強く平滑化されますが、処理時間がかかります。
  • hr が大きいほど、同じ色に平滑化される候補の色の範囲が広がり、強く平滑化されます。 hr は処理時間にはあまり影響しません。
  • max_iter が大きい、かつ、tol_coef が小さいとき、精度がよくなりますが、処理時間がかかります。
    max_iter の値を小さく、あるいは、 tol_coef の値を大きくすれば、精度は落ちてしまいますが、処理時間を短縮できます。
アルゴリズム
Mean-Shift 法は、点群を標本点として得られる確率密度関数を考え、その確率密度関数の極大点を探索する手法です。
近傍の点群の平均へ移動を繰り返すと確率密度関数の極大点へ収束することを利用して、探索を行います。
Mean-Shift 法による画像の平滑化は、以下のような流れで行われます。
  • 画素位置 - 濃度値 の結合空間を考え、すべての画素を標本点とする。
  • すべての画素を初期点とし、Mean-Shift を行う。
    • 現在地点 ( 最初は注目する標本点そのもの ) を $ {\bf y}_j $ とする。
    • $ {\bf y}_j $ の近傍に存在する標本点の加重平均 $ {\bf y}_{j+1} $$ {\bf y}_j $ を更新する。
    • 上記を収束するまで繰り返す。
  • 初期点の濃度値を収束点の濃度値で置き換え、出力する。
確率密度関数の推定、およびカーネル幅について
標本点を中心とするカーネル関数の総和を正規化することで、確率密度関数を推定します。
下図は、Epanechnikov カーネル ( 青 ) による確率密度関数 ( 赤 ) 推定の例を表しています。
カーネル幅を狭くすると、極大点が多くなり、カーネル幅を広くすると、極大点が少なくなります。
このことから、Mean-Shift 法におけるカーネル幅は、標本点がどれだけ同じ地点へ集まりやすいかということを表します。
カーネル幅は、空間軸においては hs 、色空間軸においては hr と一致します。
ここで、色空間とは、濃度値を特徴量とする n 次元の空間 ( n はチャネル数 ) を意味するものとします。
つまり、hs, hr の値を大きくするほど、同じ濃度値に収束しやすくなり、強く平滑化されます。
fie_meanshift_density1.png

カーネル幅が狭いとき

fie_meanshift_density2.png

カーネル幅が広いとき

Mean-Shift 更新
本関数では、確率密度関数推定のためのカーネル関数として、空間領域において放射同形な Epanechnikov カーネルと色空間領域において放射同形な Epanechnikov カーネルの積を用います。
現在地点 $ {\bf y}_j $ の空間における位置を $ {\bf y}^s_j $ 、色空間における位置を $ {\bf y}^r_j $ とし、 標本点 $ {\bf x}_i $ の空間における位置を $ {\bf x}^s_i $ 、色空間における位置を $ {\bf x}^r_i $ とします。
$ {\bf y}^s_j $$ {\bf x}^s_i $ のユークリッド距離が hs 以下、かつ、$ {\bf y}^r_j $$ {\bf x}^r_i $ のユークリッド距離が hr 以下のとき、$ {\bf x}_i $$ {\bf y}_j $ の近傍点とみなし、距離に応じた重みを用いた加重平均により、Mean-Shift 更新後の地点 $ {\bf y}_{j+1} $ を算出します。
収束条件について
Mean-Shift 法は繰り返し法であるため、収束条件を設けています。
以下のどちらかを満たしたとき、収束したとみなし、Mean-Shift を打ち切ります。
  • 平均への移動回数が max_iter へ達したとき
  • 移動前と移動後の空間領域における差分ベクトルのノルムが tol_coef × hs 以下、 かつ、移動前と移動後の色空間領域における差分ベクトルのノルムが tol_coef × hr 以下となったとき
引数:
[in] hsrc 入力画像( type: uc8, s16, us16, double )
[out] hdst 出力画像( type: uc8, s16, us16, double )
[in] hs 空間軸におけるカーネル幅( 単位 : pixel, 1.0 ≦ hs )
[in] hr 色空間軸におけるカーネル幅( 単位 : 濃度, 0 < hr )
[in] max_iter 最大の反復数( 1 ≦ max_iter )
[in] tol_coef 収束許容値の係数( 0 ≦ tol_coef )
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参考文献:
  • D. Comaniciu and P. Meer, "Mean Shift: A Robust Approach Toward Feature Space Analysis," IEEE Trans. on Pattern Analysis and Machine Intelligence, vol.24, no.5, pp.603-619, 2002.
  • 画像情報教育振興協会, "ディジタル画像処理[改訂新版]," pp.205-210, 2015.
処理結果例 :
入力画像 (256x192)
fie_meanshift_filter_src.png
結果画像 (hs = 2, hr = 20) 結果画像 (hs = 2, hr = 40)
fie_meanshift_filter_hs2_hr20.png
fie_meanshift_filter_hs2_hr40.png
結果画像 (hs = 4, hr = 20) 結果画像 (hs = 4, hr = 40)
fie_meanshift_filter_hs4_hr20.png
fie_meanshift_filter_hs4_hr40.png

INT FVALGAPI fnFIE_median ( FHANDLE  fhSrc,
FHANDLE  fhDst,
INT  border_mode,
DOUBLE  value 
)

median filter

median filterを施します。 注目画素を中心とする3×3の領域(注目画素+8近傍)内にある9つの値の中央値で注目画素の値を置き換えるフィルタです。 なお、フィルタのアンカー位置は、フィルタの中心となります。

ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照してください。

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_median.png

処理結果画像

INT FVALGAPI fnFIE_rank_filter ( FHANDLE  fhSrc,
FHANDLE  fhDst,
INT  iRank,
INT  border_mode,
DOUBLE  value 
)

rank filter

rank filterを施します。 注目画素を中心とする3×3の領域(注目画素+8近傍)内で9つの値を濃淡値の昇順にソートし、 注目画素を指定のランク(順番)の値に置き換えます。 なお、フィルタのアンカー位置は、フィルタの中心となります。

ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照してください。

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] iRank ランク(1〜9)
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
  • iRank < 1 || iRank > 9
  • border_mode 異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_rank1.png

処理結果画像( iRank = 1 )

fie_rank5.png

処理結果画像( iRank = 5 )

fie_rank9.png

処理結果画像( iRank = 9 )

INT FVALGAPI fnFIE_median_approximation ( FHANDLE  fhSrc,
FHANDLE  fhDst,
INT  border_mode,
DOUBLE  value 
)

median approximation filter

近似median filterを施します。 注目画素を中心とする3×3の領域(注目画素+8近傍)内にある9つの値の「中央または4番目または6番目の値」で注目画素の値を置き換えるフィルタです。 なお、フィルタのアンカー位置は、フィルタの中心となります。

ボーダー処理モードがF_BORDER_NONEの時、出力画像の周囲1画素は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常( border_mode 異常 )
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_median_approx.png

処理結果画像

INT FVALGAPI fnFIE_medianMxN ( FHANDLE  hSrc,
FHANDLE  hTar,
INT  iH,
INT  iV,
INT  iBrdMod 
)

median filter with variable filtering window

任意のフィルタサイズ(M x N)で median filter を施します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

フィルタサイズは下記の条件をすべて満たしている必要があります。

  • フィルタの幅と高さは奇数である
  • 幅と高さは共に1以上253以下である

入力画像と出力画像は下記の条件をすべて満たしている必要があります。

  • サイズ(幅・高さ)、チャネル数、画像の型が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE のいずれか
  • 画像サイズはフィルタサイズより小さくないこと

ボーダー処理モードがF_BORDER_NONEの時、

  • 画像の左右$ \lfloor \frac{m}{2} \rfloor$画素
  • 画像の上下$ \lfloor \frac{n}{2} \rfloor$画素

は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hSrc 処理対象画像(type: uc8, s16, us16, double )
[out] hTar 処理結果画像(type: uc8, s16, us16, double )
[in] iH フィルタの幅(水平方向)
  • 1 <= iH <= 253
  • 奇数である
[in] iV フィルタの高さ(垂直方向)
  • 1 <= iV <= 253
  • 奇数である
[in] iBrdMod ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
  • iBrdMod 異常
  • iH 又は iV サイズ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参考文献:
  • Ahmad, M. O. and Sundararajan, D., "A Fast Algorithm for Two-Dimensional Median Filtering", IEEE Trans. on Circ. and Sys., Vol. Cas-34, No.11, pp. 1364-74, 1987(11)

処理結果例:
floppy1.png

入力画像

fie_median5x5.png

処理結果画像( iH = iV = 5 )

INT FVALGAPI fnFIE_DoM_2Dfilter ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  size_m0,
INT  size_n0,
INT  size_m1,
INT  size_n1,
INT  border_mode,
DOUBLE  value 
)

Difference of Median filter

size_m0 x size_n0 のサイズのメディアンフィルタから size_m1 x size_n1 のサイズのメディアンフィルタを引いた画像を出力します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

処理対象画像がF_IMG_UC8,F_IMG_US16型のとき、結果値がマイナス値となる場合は絶対値を出力します。 F_IMG_S16では、演算結果に対して サチュレーション処理を行った後に出力します。

フィルタサイズは下記の条件をすべて満たしている必要があります。

  • フィルタの幅と高さは奇数である
  • 幅と高さは共に1以上253以下である

入力画像と出力画像は下記の条件をすべて満たしている必要があります。

  • サイズ(幅・高さ)、チャネル数、画像の型が等しい
  • 入力画像の型はF_IMG_UC8,F_IMG_S16,F_IMG_US16,F_IMG_DOUBLEのいずれか
  • 画像サイズはフィルタサイズより小さくないこと

ボーダー処理モードがF_BORDER_NONEの時、 m:size_m0size_m1 のうち小さくない方、 n:size_n0size_n1 のうち小さくない方、とすると

  • 画像の左右$ \lfloor \frac{m}{2} \rfloor$画素
  • 画像の上下$ \lfloor \frac{n}{2} \rfloor$画素

は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, double )
[out] hdst 出力画像 ( type: uc8, s16, us16, double )
[in] size_m0 フィルタ幅( 水平方向 1以上で253,画像幅以下の奇数 )
[in] size_n0 フィルタ高さ ( 垂直方向 1以上で253,画像幅以下の奇数 )
[in] size_m1 フィルタ幅( 水平方向 1以上で253,画像幅以下の奇数 )
[in] size_n1 フィルタ高さ ( 垂直方向 1以上で253,画像幅以下の奇数 )
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は,この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像オブジェクト
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足
F_ERR_NO_LICENCE ライセンスエラーまたは未初期化エラー

INT FVALGAPI fnFIE_minMxN ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  size_m,
INT  size_n,
INT  border_mode,
DOUBLE  border_val 
)

最小値フィルタ (MxN)

任意のフィルタサイズ(MxN)において最小値フィルタを施します。 フィルタのアンカー位置は、フィルタの中心となります。
つまり注目画素を中心とする MxN 領域内にある最小画素値で注目画素の値が置き換えられます。

フィルタサイズは下記の条件を満たしている必要があります。

  • フィルタの幅と高さが共に1以上の奇数である
  • フィルタのサイズは画像サイズ以下である

入力画像と出力画像は下記の条件を満たしている必要があります。

  • 入力画像と出力画像の幅と高さは同じである
  • 入力画像と出力画像のチャネル数は同じである
  • 入力画像と出力画像の画像型は同じである

またボーダー処理モードが F_BORDER_NONE の時、 出力画像の左右 $ \lfloor \frac{m}{2} \rfloor $ 画素、 及び 上下 $ \lfloor \frac{n}{2} \rfloor $ 画素は処理されません。
ボーダー処理モードが F_BORDER_NONE 以外の時、 入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、 出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

画像形式がF_IMG_RGBQUADの場合、各画素の濃度値は rgbRed, rgbGreen, rgbBlue それぞれで演算を行います。 また、rgbReservedは0になります。 画像の型が F_IMG_RGBTRIPLE の場合、R,G,B それぞれで演算を行います。

引数:
[in] hsrc 入力画像 ( type: bin, uc8, s16, us16, i32, ui32, float, double, rgbq, rgbtri )
[out] hdst 出力画像 ( type: bin, uc8, s16, us16, i32, ui32, float, double, rgbq, rgbtri )
[in] size_m フィルタの幅 ( 水平方向 1 以上画像幅以下の奇数 )
[in] size_n フィルタの高さ ( 垂直方向 1 以上画像高さ以下の奇数 )
[in] border_mode ボーダー処理モード. 下記のいずれかを指定.
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_val ボーダー濃度値.
border_mode が F_BORDER_VALUE の場合のみ使用されます. その他のモードの場合、この値は無視されます.
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_maxMxN ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  size_m,
INT  size_n,
INT  border_mode,
DOUBLE  border_val 
)

最大値フィルタ (MxN)

任意のフィルタサイズ(MxN)において最大値フィルタを施します。 フィルタのアンカー位置は、フィルタの中心となります。
つまり注目画素を中心とする MxN 領域内にある最大画素値で注目画素の値が置き換えられます。

フィルタサイズは下記の条件を満たしている必要があります。

  • フィルタの幅と高さが共に1以上の奇数である
  • フィルタのサイズは画像サイズ以下である

入力画像と出力画像は下記の条件を満たしている必要があります。

  • 入力画像と出力画像の幅と高さは同じである
  • 入力画像と出力画像のチャネル数は同じである
  • 入力画像と出力画像の画像型は同じである

またボーダー処理モードが F_BORDER_NONE の時、 出力画像の左右 $ \lfloor \frac{m}{2} \rfloor $ 画素、 及び 上下 $ \lfloor \frac{n}{2} \rfloor $ 画素は処理されません。
ボーダー処理モードが F_BORDER_NONE 以外の時、 入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、 出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

画像形式がF_IMG_RGBQUADの場合、各画素の濃度値は rgbRed, rgbGreen, rgbBlue それぞれで演算を行います。 また、rgbReservedは0になります。 画像の型が F_IMG_RGBTRIPLE の場合、R,G,B それぞれで演算を行います。

引数:
[in] hsrc 入力画像 ( type: bin, uc8, s16, us16, i32, ui32, float, double, rgbq, rgbtri )
[out] hdst 出力画像 ( type: bin, uc8, s16, us16, i32, ui32, float, double, rgbq, rgbtri )
[in] size_m フィルタの幅 ( 水平方向 1 以上画像幅以下の奇数 )
[in] size_n フィルタの高さ ( 垂直方向 1 以上画像高さ以下の奇数 )
[in] border_mode ボーダー処理モード. 下記のいずれかを指定.
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_val ボーダー濃度値.
border_mode が F_BORDER_VALUE の場合のみ使用されます. その他のモードの場合、この値は無視されます.
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_kirsch ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  denom,
enum f_direction  calc_mode,
INT  border_mode,
INT  border_value 
)

kirsch フィルタ

3x3のkirsch微分フィルタを入力画像に適用し、出力画像に結果を出力します。 パラメータ calc_mode の指定によって、実行するフィルタの演算は下記のように変化します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

F_DIRECT_0 〜 F_DIRECT_315
calc_mode に F_DIRECT_0 〜 F_DIRECT_315 を指定した場合、本関数は 下記に定義される3x3フィルタカーネルによるフィルタ処理結果を出力します。 フィルタカーネルのアンカーは3x3カーネルの中心部分になります。
	F_DIRECT_0        F_DIRECT_45       F_DIRECT_90       F_DIRECT_135
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	|-3 |-3 | 5 |     |-3 |-3 |-3 |     |-3 |-3 |-3 |     |-3 |-3 |-3 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	|-3 | 0 | 5 |     |-3 | 0 | 5 |     |-3 | 0 |-3 |     | 5 | 0 |-3 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	|-3 |-3 | 5 |     |-3 | 5 | 5 |     | 5 | 5 | 5 |     | 5 | 5 |-3 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+

	F_DIRECT_180      F_DIRECT_225      F_DIRECT_270      F_DIRECT_315
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	| 5 |-3 |-3 |     | 5 | 5 |-3 |     | 5 | 5 | 5 |     |-3 | 5 | 5 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	| 5 | 0 |-3 |     | 5 | 0 |-3 |     |-3 | 0 |-3 |     |-3 | 0 | 5 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	| 5 |-3 |-3 |     |-3 |-3 |-3 |     |-3 |-3 |-3 |     |-3 |-3 |-3 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	

F_DIRECT_MAX4
calc_mode に F_DIRECT_MAX4 を指定した場合、本関数は F_DIRECT_0, F_DIRECT_90, F_DIRECT_180, F_DIRECT_270 の4つのフィルタカーネルによって フィルタ処理を行った後、これらの処理結果から最大濃度値を各画素ごとに算出し その値を出力します。
F_DIRECT_MAX8
calc_mode に F_DIRECT_MAX8 を指定した場合、本関数は F_DIRECT_0, F_DIRECT_45, 〜, F_DIRECT_315 の8つのフィルタカーネルによって フィルタ処理を行った後、これらの処理結果から最大濃度値を各画素ごとに算出し その値を出力します。
スケーリング
denom パラメータはフィルタ処理時に適用されるフィルタ係数分母の値です。 fnFIE_kernel_filter() の kernel->denom と同等の意味のパラメータです。 本関数の処理結果画像の濃度値が大きくなりすぎる場合には、本パラメータに1より大きい値 を指定する事によって出力濃度値の値域を抑制することが出来ます。 特にスケーリングの必要性が無い場合は 1.0 を指定してください。 ただし fnFIE_kernel_filter() と同様に画像の型が整数型の場合には、 denom も整数値に変換して扱われることに注意してください。
境界部分処理について
画像の周囲1画素については3x3のカーネルがはみ出すため、正しくは値を求める事が出来ません。 しかし、本関数では fnFIE_copy_border() 関数を使用し入力画像を拡張することで、 擬似的に周囲1画素の結果値も出力できるようになっています。 これは border_mode 及び border_value パラメータにより制御されます。 border_mode パラメータに F_BORDER_NONE を指定した場合は、この拡張処理を行わず、 出力画像の周囲1画素には値を書き込みません(元の値が保持される)。 F_BORDER_NONE以外を指定した場合には、処理前に fnFIE_copy_border() 関数を実行し、 入力画像を縁の分だけ拡張した後にフィルタ処理を行います。 このため、周囲1画素の値も擬似的に計算され、結果値が格納されます。 なお border_mode , border_value は、どちらも fnFIE_copy_border() 関数に そのまま渡されるパラメータです。値の意味については fnFIE_copy_border() 関数を参照して下さい。
出力画像と入力画像は同じサイズ、チャネル数、画像型でなければなりません。

引数:
[in] hsrc 入力画像ハンドル( type: uc8, s16, us16, double )
[out] hdst 出力先画像ハンドル( type: uc8, s16, us16, double )
[in] denom フィルタ係数分母
[in] calc_mode kirschの計算モード。下記のいずれかを指定。
  • F_DIRECT_0 0度方向カーネル
  • F_DIRECT_45 45度方向カーネル
  • F_DIRECT_90 90度方向カーネル
  • F_DIRECT_135 135度方向カーネル
  • F_DIRECT_180 180度方向カーネル
  • F_DIRECT_225 225度方向カーネル
  • F_DIRECT_270 270度方向カーネル
  • F_DIRECT_315 315度方向カーネル
  • F_DIRECT_MAX4 0,90,180,270度カーネルでの処理結果の最大値
  • F_DIRECT_MAX8 0,45,...,315度カーネルでの処理結果の最大値
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された。
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_kirsch.png

処理結果画像: calc_mode=F_DIRECT_MAX8, denom=4.0

INT FVALGAPI fnFIE_robinson ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  denom,
enum f_direction  calc_mode,
INT  border_mode,
INT  border_value 
)

robinson フィルタ

3x3のロビンソン微分フィルタを入力画像に適用し、出力画像に結果を出力します。 パラメータ calc_mode の指定によって、実行するフィルタの演算は下記のように変化します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

F_DIRECT_0 〜 F_DIRECT_315
calc_mode に F_DIRECT_0 〜 F_DIRECT_315 を指定した場合、本関数は 下記に定義される3x3フィルタカーネルによるフィルタ処理結果を出力します。 フィルタカーネルのアンカーは3x3カーネルの中心部分になります。
	F_DIRECT_0        F_DIRECT_45       F_DIRECT_90       F_DIRECT_135
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	|-1 | 0 | 1 |     |-2 |-1 | 0 |     |-1 |-2 |-1 |     | 0 |-1 |-2 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	|-2 | 0 | 2 |     |-1 | 0 | 1 |     | 0 | 0 | 0 |     | 1 | 0 |-1 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	|-1 | 0 | 1 |     | 0 | 1 | 2 |     | 1 | 2 | 1 |     | 2 | 1 | 0 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+

	F_DIRECT_180      F_DIRECT_225      F_DIRECT_270      F_DIRECT_315
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	| 1 | 0 |-1 |     | 2 | 1 | 0 |     | 1 | 2 | 1 |     | 0 | 1 | 2 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	| 2 | 0 |-2 |     | 1 | 0 |-1 |     | 0 | 0 | 0 |     |-1 | 0 | 1 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	| 1 | 0 |-1 |     | 0 |-1 |-2 |     |-1 |-2 |-1 |     |-2 |-1 | 0 |
	+---+---+---+     +---+---+---+     +---+---+---+     +---+---+---+
	

F_DIRECT_MAX4
calc_mode に F_DIRECT_MAX4 を指定した場合、本関数は F_DIRECT_0, F_DIRECT_90, F_DIRECT_180, F_DIRECT_270 の4つのフィルタカーネルによって フィルタ処理を行った後、これらの処理結果から最大濃度値を各画素ごとに算出し その値を出力します。
F_DIRECT_MAX8
calc_mode に F_DIRECT_MAX8 を指定した場合、本関数は F_DIRECT_0, F_DIRECT_45, 〜, F_DIRECT_315 の8つのフィルタカーネルによって フィルタ処理を行った後、これらの処理結果から最大濃度値を各画素ごとに算出し その値を出力します。
スケーリング
denom パラメータはフィルタ処理時に適用されるフィルタ係数分母の値です。 fnFIE_kernel_filter() の kernel->denom と同等の意味のパラメータです。 本関数の処理結果画像の濃度値が大きくなりすぎる場合には、本パラメータに1より大きい値 を指定する事によって出力濃度値の値域を抑制することが出来ます。 特にスケーリングの必要性が無い場合は 1.0 を指定してください。 ただし fnFIE_kernel_filter() と同様に画像の型が整数型の場合には、 denom も整数値に変換して扱われることに注意してください。
境界部分処理について
画像の周囲1画素については3x3のカーネルがはみ出すため、正しくは値を求める事が出来ません。 しかし、本関数では fnFIE_copy_border() 関数を使用し入力画像を拡張することで、 擬似的に周囲1画素の結果値も出力できるようになっています。 これは border_mode 及び border_value パラメータにより制御されます。 border_mode パラメータに F_BORDER_NONE を指定した場合は、この拡張処理を行わず、 出力画像の周囲1画素には値を書き込みません(元の値が保持される)。 F_BORDER_NONE以外を指定した場合には、処理前に fnFIE_copy_border() 関数を実行し、 入力画像を縁の分だけ拡張した後にフィルタ処理を行います。 このため、周囲1画素の値も擬似的に計算され、結果値が格納されます。 なお border_mode , border_value は、どちらも fnFIE_copy_border() 関数に そのまま渡されるパラメータです。値の意味については fnFIE_copy_border() 関数を参照して下さい。
出力画像と入力画像は同じサイズ、チャネル数、画像型でなければなりません。

引数:
[in] hsrc 入力画像ハンドル( type: uc8, s16, us16, double )
[out] hdst 出力先画像ハンドル( type: uc8, s16, us16, double )
[in] denom フィルタ係数分母
[in] calc_mode robinsonの計算モード。下記のいずれかを指定。
  • F_DIRECT_0
  • F_DIRECT_45
  • F_DIRECT_90
  • F_DIRECT_135
  • F_DIRECT_180
  • F_DIRECT_225
  • F_DIRECT_270
  • F_DIRECT_315
  • F_DIRECT_MAX4
  • F_DIRECT_MAX8
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された。
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_robinson.png

処理結果画像: calc_mode=F_DIRECT_MAX8, denom=2.0

INT FVALGAPI fnFIE_prewitt ( FHANDLE  hsrc,
FHANDLE  hdst,
enum f_filter_mode  calc_mode,
INT  border_mode,
DOUBLE  border_value 
)

prewitt フィルタ

3x3のprewitt 微分フィルタを入力画像に適用し、出力画像に結果を出力します。 パラメータ calc_mode の指定によって、実行するフィルタの演算は下記の様に変化します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

  • F_FILTER_X_MODE
    X方向微分を表す、下記の3x3カーネルにてコンボリューション演算(下式)を行った結果値を出力します。 出力画像の型が符号無し型の場合は、絶対値を取ります。 また、結果値が出力画像の型の最大値を超える場合は、その最大値でサチュレーション処理されます。
    		[-1][0][1]
    		[-1][0][1]
    		[-1][0][1]
    	

    \begin{eqnarray*} Gx_{(i,j)} = &- \{ f_{(i-1,j-1)} + f_{(i-1,j)} + f_{(i-1,j+1)} \} \\ &+ f_{(i+1,j-1)} + f_{(i+1,j)} + f_{(i+1,j+1)} \end{eqnarray*}

  • F_FILTER_Y_MODE
    Y方向微分を表す、下記の3x3カーネルにてコンボリューション演算(下式)を行った結果値を出力します。 出力画像の型が符号無し型の場合は、絶対値を取ります。 また、結果値が出力画像の型の最大値を超える場合は、その最大値で飽和処理されます。
    		[-1][-1][-1]
    		[ 0][ 0][ 0]
    		[ 1][ 1][ 1]
    	

    \begin{eqnarray*} Gy_{(i,j)} = &- \{ f_{(i-1,j-1)} + f_{(i,j-1)} + f_{(i+1,j-1)} \} \\ &+ f_{(i-1,j+1)} + f_{(i,j+1)} + f_{(i+1,j+1)} \end{eqnarray*}

  • F_FILTER_XY_MODE
    X方向微分の結果とY方向微分の結果の絶対値和を出力します。 結果値が出力画像の型の最大値を超える場合は、その最大値で飽和処理されます。

    \[ Gxy_{(i,j)} = |Gx_{(i,j)}| + |Gy_{(i,j)}| \]

  • F_FILTER_SQRT_MODE
    X方向微分の結果とY方向微分の結果から、ユークリッド距離を求め、出力します。 結果値が出力画像の型の最大値を超える場合は、その最大値で飽和処理されます。

    \[ Gsqrt_{(i,j)} = \sqrt{ {Gx_{(i,j)}}^{2} + {Gy_{(i,j)}}^{2} } \]

境界部分処理について
画像の周囲1画素については、prewittの3x3のカーネルがはみ出すため、正しくは値を求める事が出来ません。 しかし、本関数では fnFIE_copy_border() 関数を使用し入力画像を拡張することで、 擬似的に周囲1画素の結果値も出力できるようになっています。 これは border_mode 及び border_value パラメータにより制御されます。 border_mode パラメータに F_BORDER_NONE を指定した場合は、この拡張処理を行わず、 出力画像の周囲1画素には値を書き込みません(元の値が保持される)。 F_BORDER_NONE以外を指定した場合には、処理前に fnFIE_copy_border() 関数を実行し、 入力画像を縁の分だけ拡張した後にフィルタ処理を行います。 このため、周囲1画素の値も擬似的に計算され、結果値が格納されます。 なお border_mode , border_value は、どちらも fnFIE_copy_border() 関数に そのまま渡されるパラメータです。値の意味については fnFIE_copy_border() 関数を参照して下さい。
入力画像と同じサイズ、チャネル数、画像型である必要があります。 但し、入力がF_IMG_UC8型、出力がF_IMG_S16型の場合は許可されます。

引数:
[in] hsrc 入力画像ハンドル( type: uc8, s16, us16, double )
[out] hdst 出力先画像ハンドル( type: uc8, s16, us16, double )
[in] calc_mode prewittの計算モード。下記のいずれかを指定。
  • F_FILTER_X_MODE X方向微分
  • F_FILTER_Y_MODE Y方向微分
  • F_FILTER_XY_MODE XY方向微分(絶対値和)
  • F_FILTER_SQRT_MODE XY方向微分(ユークリッド距離)
[in] border_mode ボーダーコピーモード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode が F_BORDER_VALUE の場合のみ使用されます。 その他のボーダーモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された。
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
左より
  • (1)入力画像
  • (2)F_FILTER_X_MODEによる処理結果画像
  • (3)F_FILTER_Y_MODEによる処理結果画像
  • (4)F_FILTER_XY_MODEによる処理結果画像
  • (5)F_FILTER_SQRT_MODEによる処理結果画像
となります。 画素タイプは、入力画像、出力画像共に、 F_IMG_UC8 です。
fie_prewitt.png

INT FVALGAPI fnFIE_projection ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  mode 
)

画像の縦方向や横方向の投影を算出する

引数 mode に従って画素値を算出して出力します。複数のチャネルを持つ画像の場合はチャネル毎に出力します。
出力画像が整数型の場合、サチュレーション処理を行った後に出力します。

mode = 0 のとき
水平投影です。入力画像でy座標が同一である水平方向の1行を処理対象画素とし、画素値を合計して出力画像でy座標が等しい画素に書き込みます。

\[ Dst(x,y) = \sum_{i=0}^{width-1} Src(i,y) \]

mode = 1 のとき
垂直投影です。入力画像でx座標が同一である垂直方向の一列を処理対象画素とし、画素値を合計して出力画像でx座標が等しい画素に書き込みます。

\[ Dst(x,y) = \sum_{i=0}^{height-1} Src(x,i) \]

mode = 2 のとき
水平垂直投影です。入力画像の全画素を処理対象画素とし、画素値を合計して出力画像全面に書き込みます。入力が二値画像なら白色面積計測と同じです。

\[ Dst(x,y) = \sum_{i=0}^{width-1} \sum_{j=0}^{height-1} Src(i,j) \]

mode = 3 のとき
水平投影平均です。入力画像でy座標が同一である水平方向の1行を処理対象画素とし、画素値を合計して処理対象画素数で割った値を四捨五入して出力画像でy座標が等しい画素に書き込みます。

\[ Dst(x,y) = \frac{1}{width}\sum_{i=0}^{width-1} Src(i,y) \]

mode = 4 のとき
垂直投影平均です。入力画像でx座標が同一である垂直方向の一列を処理対象画素とし、画素値を合計して処理対象画素数で割った値を四捨五入して出力画像でx座標が等しい画素に書き込みます。

\[ Dst(x,y) = \frac{1}{height}\sum_{i=0}^{height-1} Src(x,i) \]

mode = 5 のとき
水平垂直投影平均です。入力画像の全画素を処理対象画素とし、画素値を合計して処理対象画素数で割った値を四捨五入して出力画像全面に書き込みます。

\[ Dst(x,y) = \frac{1}{width \cdot height} \sum_{i=0}^{width-1} \sum_{j=0}^{height-1} Src(i,j) \]

modeの制限
以下の表は画像型の組合せ別に実行可能なモードを表したものです。記載のないモードを実行した場合、 F_ERR_INVALID_PARAM が返ります。×の記載のある組合せでは F_ERR_INVALID_IMAGE が返ります。
  出力画像形式
BIN UC8 S16 US16 DOUBLE
入力画像
形式
BIN 3,4,5 × × × 0,1,2
UC8 × 3,4,5 × × 0,1,2
S16 × × 3,4,5 × 0,1,2
US16 × × × 3,4,5 0,1,2
引数:
[in] src 入力画像( type: bin, uc8, s16, us16 )
[out] dst 出力画像( type: bin, uc8, s16, us16, dobule )
  • 出力画像は入力画像と同じ型であるか、F_IMG_DOUBLE型でなくてはなりません。
  • 出力画像は入力画像と同じチャネル数でなければなりません。
  • mode の値が0または3であるとき、出力画像の高さは入力画像の高さと同一でなければなりません。
  • mode の値が1または4であるとき、出力画像の幅は入力画像の幅と同一でなければなりません。
  • mode の値が2または5であるとき、出力画像の画像サイズは入力画像と異なっていてかまいません。
[in] mode 処理の内容
  • 0 水平投影
  • 1 垂直投影
  • 2 画像全体合計
  • 3 水平投影後、平均値を算出
  • 4 垂直投影後、平均値を算出
  • 5 画像全体合計後、平均値を算出
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータ
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡されたため、異常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_replace_inf ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  pval,
DOUBLE  mval 
)

Inf(無限大)を数値に置き換える

対象の画像の+Infと-Infをそれぞれ指定の数値に置き換え、出力画像に出力します。

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数でなければなりません。

引数:
[in] hsrc 入力画像ハンドル( type: double, float)
[out] hdst 出力画像ハンドル( type: double, float)
[in] pval +Infを置き換える数値
  • DOUBLE型で入力されます。
  • 対象画像のタイプが F_IMG_FLOAT の場合は単純キャストされます。
  • pval >= mval でなければなりません。
[in] mval -Infを置き換える数値
  • DOUBLE型で入力されます。
  • 対象画像のタイプが F_IMG_FLOAT の場合は単純キャストされます。
  • pval >= mval でなければなりません。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡されたため、異常終了
F_ERR_INVALID_PARAM パラメータエラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
当関数はin-place処理可能です。

INT FVALGAPI fnFIE_replace_nan ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  val 
)

NaN( 非数 )を数値に置き換える

対象の画像のNaNを指定の数値に置き換え、出力画像に出力します。

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数でなければなりません。

引数:
[in] hsrc 入力画像ハンドル( type: double, float )
[out] hdst 出力画像ハンドル( type: double, float )
[in] val NaNを置き換える数値
  • DOUBLE型で入力されます。
  • 対象画像のタイプが F_IMG_FLOAT の場合は単純キャストされます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡されたため、異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
当関数はin-place処理可能です。

INT FVALGAPI fnFIE_roberts ( FHANDLE  fhSrc,
FHANDLE  fhDst,
INT  border_mode,
DOUBLE  value 
)

roberts filter

roberts filterを施します。 注目画素を左上とする2x2の領域において、次のような演算を施します。

	入力画像の座標(i,j) : f(i,j)、出力画像の座標(i,j) : g(i,j)

	g(i,j) = | f(i,j) - f(i+1,j+1) | + | f(i+1,j) - f(i,j+1) |

	

ボーダー処理モードがF_BORDER_NONEの時、出力画像の右端、下端1画素分処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

引数:
[in] fhSrc 処理対象画像( type: uc8, s16, us16, double )
[out] fhDst 処理結果画像( type: uc8, s16, us16, double )
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常(border_mode異常)
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_roberts.png

処理結果画像

INT FVALGAPI fnFIE_sharp ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  border_mode,
DOUBLE  border_value 
)

鮮鋭化フィルタ

3x3の鮮鋭化フィルタを入力画像に適用し、出力画像に結果を出力します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

下記の3x3カーネルにてコンボリューション演算を行った結果値を出力します。 出力画像の型が符号無し型の場合は、絶対値を取ります。 また、結果値が出力画像の型の最大値を超える場合は、その最大値でサチュレーション処理されます。

		[-1][-1][-1]
		[-1][ 9][-1]
		[-1][-1][-1]
	

境界部分処理について
画像の周囲1画素については、sharpの3x3のカーネルがはみ出すため、正しくは値を求める事が出来ません。 しかし、本関数では fnFIE_copy_border() 関数を使用し入力画像を拡張することで、 擬似的に周囲1画素の結果値も出力できるようになっています。 これは border_mode 及び border_value パラメータにより制御されます。 border_mode パラメータに F_BORDER_NONE を指定した場合は、この拡張処理を行わず、 出力画像の周囲1画素には値を書き込みません(元の値が保持される)。 F_BORDER_NONE以外を指定した場合には、処理前に fnFIE_copy_border() 関数を実行し、 入力画像を縁の分だけ拡張した後にフィルタ処理を行います。 このため、周囲1画素の値も擬似的に計算され、結果値が格納されます。 なお border_mode , border_value は、どちらも fnFIE_copy_border() 関数に そのまま渡されるパラメータです。値の意味については fnFIE_copy_border() 関数を参照して下さい。
入力画像と同じサイズ、チャネル数、画像型である必要があります。 但し、入力がF_IMG_UC8型、出力がF_IMG_S16型の場合は許可されます。

引数:
[in] hsrc 入力画像ハンドル( type: uc8, s16, us16, double )
[out] hdst 出力先画像ハンドル( type: uc8, s16, us16, double )
[in] border_mode ボーダーコピーモード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode が F_BORDER_VALUE の場合のみ使用されます。 その他のコピーモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された。
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
左より、(1)入力画像、(2)処理結果画像となります。 画素タイプは、入力画像、出力画像共に、 F_IMG_UC8 です。
fie_sharp.png

INT FVALGAPI fnFIE_sobel ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  calc_mode,
INT  border_mode,
DOUBLE  border_value 
)

sobel フィルタ

3x3のソーベル微分フィルタを入力画像に適用し、出力画像に結果を出力します。 パラメータ calc_mode の指定によって、実行するフィルタの演算は下記の様に変化します。 なお、フィルタのアンカー位置は、フィルタの中心となります。

  • F_SOBEL_X_MODE
    X方向微分を表す、下記の3x3カーネルにてコンボリューション演算(下式)を行った結果値を出力します。 出力画像の型が符号無し型の場合は、絶対値を取ります。 また、結果値が出力画像の型の最大値を超える場合は、その最大値でサチュレーション処理されます。
    		[-1][0][1]
    		[-2][0][2]
    		[-1][0][1]
    	

    \begin{eqnarray*} Gx_{(i,j)} = &- \{ f_{(i-1,j-1)} + 2 f_{(i-1,j)} + f_{(i-1,j+1)} \} \\ &+ f_{(i+1,j-1)} + 2 f_{(i+1,j)} + f_{(i+1,j+1)} \end{eqnarray*}

  • F_SOBEL_Y_MODE
    Y方向微分を表す、下記の3x3カーネルにてコンボリューション演算(下式)を行った結果値を出力します。 出力画像の型が符号無し型の場合は、絶対値を取ります。 また、結果値が出力画像の型の最大値を超える場合は、その最大値で飽和処理されます。
    		[-1][-2][-1]
    		[ 0][ 0][ 0]
    		[ 1][ 2][ 1]
    	

    \begin{eqnarray*} Gy_{(i,j)} = &- \{ f_{(i-1,j-1)} + 2 f_{(i,j-1)} + f_{(i+1,j-1)} \} \\ &+ f_{(i-1,j+1)} + 2 f_{(i,j+1)} + f_{(i+1,j+1)} \end{eqnarray*}

  • F_SOBEL_XY_MODE
    X方向微分の結果とY方向微分の結果の絶対値和/2を出力します。 結果値が出力画像の型の最大値を超える場合は、その最大値で飽和処理されます。

    \[ Gxy_{(i,j)} = \frac{|Gx_{(i,j)}| + |Gy_{(i,j)}|}{2} \]

  • F_SOBEL_SQRT_MODE
    X方向微分の結果とY方向微分の結果から、ユークリッド距離を求め、出力します。 結果値が出力画像の型の最大値を超える場合は、その最大値で飽和処理されます。

    \[ Gsqrt_{(i,j)} = \sqrt{ {Gx_{(i,j)}}^{2} + {Gy_{(i,j)}}^{2} } \]

境界部分処理について
画像の周囲1画素については、sobelの3x3のカーネルがはみ出すため、正しくは値を求める事が出来ません。 しかし、本関数では fnFIE_copy_border() 関数を使用し入力画像を拡張することで、 擬似的に周囲1画素の結果値も出力できるようになっています。 これは border_mode 及び border_value パラメータにより制御されます。 border_mode パラメータに F_BORDER_NONE を指定した場合は、この拡張処理を行わず、 出力画像の周囲1画素には値を書き込みません(元の値が保持される)。 F_BORDER_NONE以外を指定した場合には、処理前に fnFIE_copy_border() 関数を実行し、 入力画像を縁の分だけ拡張した後にフィルタ処理を行います。 このため、周囲1画素の値も擬似的に計算され、結果値が格納されます。 なお border_mode , border_value は、どちらも fnFIE_copy_border() 関数に そのまま渡されるパラメータです。値の意味については fnFIE_copy_border() 関数を参照して下さい。
入力画像と同じサイズ、チャネル数、画像型であること。 但し、入力がF_IMG_UC8型、出力がF_IMG_S16型の場合は許可されます。

注意
F_SOBEL_XY_MODE の場合の結果値は、X方向微分の結果とY方向微分の結果の絶対値和/2です。 2で除算しているのは、X方向微分の結果とY方向微分の結果の絶対値和が必ず偶数になるので (簡単に証明できます)、2で割ることによってダイナミックレンジを大きく取るためです。 旧来のFASTのライブラリ(FVL,FVX,etc)ではこの2で除算する処理が入っていないため、 それらと比較すると結果値が1/2になります。旧来のライブラリから移植を行う際はこの点に 十分に注意して下さい。
引数:
[in] hsrc 入力画像ハンドル( type: uc8, s16, us16, double )
[out] hdst 出力先画像ハンドル( type: uc8, s16, us16, double )
[in] calc_mode sobelの計算モード。下記のいずれかを指定。
  • F_SOBEL_X_MODE X方向微分
  • F_SOBEL_Y_MODE Y方向微分
  • F_SOBEL_XY_MODE XY方向微分(絶対値和)
  • F_SOBEL_SQRT_MODE XY方向微分(ユークリッド距離)
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された。
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
floppy1.png

入力画像

fie_soble_x.png

処理結果画像:X方向微分

fie_soble_y.png

処理結果画像:Y方向微分

fie_soble_xy.png

処理結果画:XY方向微分(絶対値和)

fie_soble_sqrt.png

処理結果画像:XY方向微分(ユークリッド距離)

INT FVALGAPI fnFIE_sobel_dir ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  border_mode,
DOUBLE  border_value 
)

sobel フィルタ

3x3のソーベル微分フィルタのX,Y方向微分値を使用して、エッジ角度画像を出力します。 角度は下記式により求められます。

\[ Angle_{(i,j)} = Atan2( Gy_{(i,j)}, Gx_{(i,j)} ) \]

但し、出力画像に書き込まれる出力値は-16384〜16384の範囲で、 これは-π〜+πを-16384〜+16384にスケーリングした値です。

なお、フィルタのアンカー位置は、フィルタの中心となります。

X方向微分Gx 及びY方向微分Gy は fnFIE_sobel() の場合と同一で、 下記式により求められる値です。

X方向微分Gx

\begin{eqnarray*} Gx_{(i,j)} = &- \{ f_{(i-1,j-1)} + 2 f_{(i-1,j)} + f_{(i-1,j+1)} \} \\ &+ f_{(i+1,j-1)} + 2 f_{(i+1,j)} + f_{(i+1,j+1)} \end{eqnarray*}

		[-1][0][1]
		[-2][0][2]
		[-1][0][1]
	

Y方向微分Gy

\begin{eqnarray*} Gy_{(i,j)} = &- \{ f_{(i-1,j-1)} + 2 f_{(i,j-1)} + f_{(i+1,j-1)} \} \\ &+ f_{(i-1,j+1)} + 2 f_{(i,j+1)} + f_{(i+1,j+1)} \end{eqnarray*}

		[-1][-2][-1]
		[ 0][ 0][ 0]
		[ 1][ 2][ 1]
	

境界部分処理について
画像の周囲1画素については、sobelの3x3のカーネルがはみ出すため、正しくは値を求める事が出来ません。 しかし、本関数では fnFIE_copy_border() 関数を使用することによって、入力画像を拡張することで、 擬似的に周囲1画素の結果値も出力できるようになっています。 これは border_mode 及び border_value パラメータにより制御されます。 border_mode パラメータにF_BORDER_NONEを指定した場合は、この拡張処理を行わず、 出力画像の周囲1画素には値を書き込みません(元の値が保持される)。 F_BORDER_NONE以外を指定した場合には、処理前に fnFIE_copy_border() 関数を実行し、 入力画像を縁の分だけ拡張した後にフィルタ処理を行います。 このため、周囲1画素の値も擬似的に計算され、結果値が格納されます。 なお border_mode border_value は、どちらも fnFIE_copy_border() 関数に そのまま渡されるパラメータです。値の意味については fnFIE_copy_border() 関数を参照して下さい。
入力画像と同じサイズ&チャネル数で無ければなりません。 また、出力画像の画像型は、F_IMG_S16でなければなりません。

引数:
[in] hsrc 入力画像ハンドル。( type: uc8, s16, us16, double )
[out] hdst 出力先画像ハンドル。( type: s16 )
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー部分は処理しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像ハンドルが渡された。
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
下記の処理結果画像は濃度値-16384〜+16384で出力された結果画像を 視認しやすいように0〜255へスケーリングした後の画像です。
floppy1.png

入力画像

fie_sobel_dir.png

処理結果画像

INT FVALGAPI fnFIE_solodel ( const FHANDLE  hSrc,
FHANDLE  hDst,
INT  color 
)

孤立点除去

処理対象の2値画像について、白または黒の孤立点を除去します。 孤立点とは、8近傍画素の色が全て自分の色と異なる場所を言います。 (下図の1から8の点。* は注目画素)

	+---+---+---+
	| 4 | 3 | 2 |
	+---+---+---+
	| 5 | * | 1 |
	+---+---+---+
	| 6 | 7 | 8 |
	+---+---+---+
	

fie_solodel.png
※便宜上、説明のために色が付いていますが、実際に処理をするものは2値画像です。

中央の画素について
上図のように、注目画素の8近傍全ての画素の値を取得し、孤立点判定を行います。 中央の黄色の画素が注目画素である場合に、周囲8近傍の青い画素の値を取得し、孤立点判定を行います。
周囲1画素について
  • 四隅の画素について
    上図のように、四隅の画素は画像の範囲内の画素のみを取得し、孤立点判定を行います。 画像の範囲外は取得しないため、画像の範囲外については状態の如何に関わりません。 それぞれ四隅の赤い画素が注目画素である場合に、画像の範囲内である青い3画素の値を取得し、孤立点判定を行います。 黄緑色の画素は画像の範囲外であるために、参照されません。
  • 四辺の画素について
    四隅の画素と同様に、画像の範囲内の画素のみを取得し、孤立点判定を行います。 画像の範囲外は取得しないため、画像の範囲外については状態の如何に関わりません。 それぞれの辺の紫色の画素が注目画素である場合に、画像の範囲内である青い5画素の値を取得し、孤立点判定を行います。 黄緑色の画素は画像の範囲外であるために、参照されません。
注意
入出力の画像オブジェクトは幅、高さが同一でなくてはなりません。 ただし、入出力の画像オブジェクトは幅、高さが2以上でなくてはなりません。 また、入出力オブジェクトのチャネル数は1のみ、画像タイプは F_IMG_BIN のみをサポートしています。
引数:
[in] hSrc 処理対象FIE画像オブジェクトハンドル( type: bin )
[out] hDst 被処理対象FIE画像オブジェクトハンドル( type: bin )
[in] color 除去対象色
  • 0 黒の孤立点の消去
  • 1 白の孤立点の消去
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像オブジェクト
F_ERR_INVALID_PARAM 不正なパラメータ( color 異常)
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
fie_solodel1.png

入力画像

fie_solodel2.png

処理結果画像

INT FVALGAPI fnFIE_steger_filter ( FHANDLE  hsrc,
FHANDLE  hdst,
FHANDLE  hdir,
DOUBLE  sigma,
DOUBLE  thresh,
INT  line_mode 
)

steger line/curve extraction filter

線(曲線)抽出フィルタです。 各画素において注目画素が線かどうかの判定を行い、線であれば線の強度と、線と直行するベクトルの向き(角度)を出力するフィルタです。 線と判定されなかった画素は、強度 0.0、角度 0となります。 線強度が thresh 未満であった場合も線と判定されません。

線強度と角度について
注目画素でヘッセ行列を求め、ヘッセ行列の最大固有値(絶対値が大きい固有値)と最大固有値の固有ベクトルを求めます。 画像上の注目画素において、ヘッセ行列を用いて作られるテイラー多項式を注目画素周辺の曲面近似だと考え、テイラー多項式の極値の位置を求めます。 極値が注目画素付近(注目画素を中心に[-0.5,0.5]×[-0.5,0.5]の区間内)にある場合に、注目画素を線と判定します。 この時、線強度は最大固有値の絶対値となり、固有ベクトルは線と直行するベクトルになります。 角度は,固有ベクトルを $ (u,v) $ とした場合、 $ \arctan(u/v) $ として求められます。 角度出力結果は、[0,16384]の範囲に正規化されます。
ガウス微分フィルタのσの意味
ガウシアンフィルタはノイズ除去の平滑化ではありません。 線の濃淡構造によって、最適なσが存在します。 今回この関数では、線の濃淡構造の平滑化のためのガウシアンフィルタと考えてよいです。
線の種類(色)
  • 輝度が周囲画素よりも低い線を抽出する場合 line_mode : F_VALLEY_MODE
  • 輝度が周囲画素よりも高い線を抽出する場合 line_mode : F_RIDGE_MODE ヘッセ行列の最大固有値が正の時、valley(谷)となり、負の時、ridge(山)となります。
内部処理
  • ガウス微分フィルタの際にF_BORDER_CONTINUOUSモードでボーダー拡張を行っています。そのため画像の端で線強度が強くなっている可能性があります。
  • ヘッセ行列の2つの固有値の値が等しくなる場合、線ではないとします。
  • 各チャネルに対して線抽出フィルタを施しています。
処理対象画像( hsrc )と線強度画像( hdst )と線角度画像( hdir )は全て同じ画像サイズ、チャネル数でなければなりません。

引数:
[in] hsrc 処理対象画像( type: uc8, s16, us16, double )
[out] hdst 線強度画像( type: double )
[out] hdir 線角度画像( type: s16 )
[in] sigma ガウス微分時のσ(1.0以上)
[in] thresh 線強度のしきい値(0.0以上)
[in] line_mode 抽出する線の種類
  • F_RIDGE_MODE 輝度が周囲画素よりも高い線
  • F_VALLEY_MODE 輝度が周囲画素よりも低い線
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常( sigma 異常、 line_mode 異常 )
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下に示す処理結果は、 0〜255の範囲で正規化をしています。
なお、指定したパラメータは以下の通りです。
  • thresh = 2.0
  • line_mode = F_RIDGE_MODE
fie_steger.png

入力画像

fie_steger_mag.png

処理結果画像:線強度( sigma = 2.0 )

fie_steger_angle.png

処理結果画像:線角度( sigma = 2.0 )

fie_steger_mag2.png

処理結果画像:線強度( sigma = 5.0 )

fie_steger_angle2.png

処理結果画像:線角度( sigma = 5.0 )

INT FVALGAPI fnFIE_steger_filter_edges ( FHANDLE  hsrc,
FHANDLE  hdst,
FHANDLE  hdir,
DOUBLE  sigma,
DOUBLE  thresh,
INT  line_mode,
F_EDGE **  edges,
INT *  edge_num 
)

エッジ出力付きステガーフィルタ(ピクセル精度)

勾配付きエッジ出力付きの線(曲線)抽出フィルタです。 基本的な処理内容は fnFIE_steger_filter() と同じですが、本関数では、 線強度画像( hdst )と線角度画像( hdir )の出力に加え、抽出した線(曲線)を勾配付きエッジとしても 出力します。なお、エッジはピクセル精度で取得します。

エッジについて
本関数で取得されるエッジは、以下のようになります。線強度・角度の詳細な内容に ついては fnFIE_steger_filter() を参照してください。
  • エッジ強度: 線検出で求められた線強度が設定されます。
  • 勾配方向 : 線検出で求められた、線と直行するベクトルの向き(角度)が設定されます。
  • 座標 : 線と判定された画素の座標が設定されます。
取得エッジ
edges は、関数内部で必要なメモリを確保します。メモリを確保した配列を指定しないで下さい。 また、*edges がNULLで初期化されていない場合は、エラーとなります。 取得されたエッジの数は edge_num に設定されます。 確保されたメモリは、 fnOAL_free() で必ず解放をして下さい。
取得エッジの座標範囲
取得エッジの範囲は以下の通りとなります。
  • 0 ≦ edges->x ≦ width - 1
  • 0 ≦ edges->y ≦ height - 1
取得エッジの強度範囲
取得エッジの強度には、検出された線強度を四捨五入し、最大値を16384として 飽和処理をした値が設定されます。
  • 強度:thresh ≦ edges->mag ≦ 16384
取得エッジの勾配方向
取得エッジの勾配方向は、線角度を以下の範囲で表した値になります。
  • 勾配方向:-180 ≦ edges->q ≦ 180 (単位:度)
入出力画像の条件
処理対象画像( hsrc )と線強度画像( hdst )と線角度画像( hdir )は全て同じ画像サイズ でなければなりません。また、チャネル数は全て1でなければなりません。 チャネル数に制限がある点が fnFIE_steger_filter() と異なるので、ご注意ください。
他の入出力パラメータについては、 fnFIE_steger_filter() と同じになります。

引数:
[in] hsrc 処理対象画像( type: uc8, s16, us16, double / 1ch )
[out] hdst 線強度画像( type: double / 1ch )
[out] hdir 線角度画像( type: s16 / 1ch )
[in] sigma ガウス微分時のσ(1.0以上)
[in] thresh 線強度のしきい値(0.0以上)
[in] line_mode 抽出する線の種類
  • F_RIDGE_MODE 輝度が周囲画素よりも高い線
  • F_VALLEY_MODE 輝度が周囲画素よりも低い線
[out] edges 取得したエッジ
[out] edge_num 取得したエッジの数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM 入力パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_thinning_filter ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  color_mode,
INT  iMode 
)

細線化フィルタ

指定の2値画像を細線化します。

チャネル数は1でなければならない。 画像幅、高さは2以上でなければならない。 入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければならない。

各モードについて
color_mode は細線化する画像の色を指定するパラメータです。
  • 0のとき・・値が0の領域を細線化します
  • 0以外・・・値が1の領域を細線化します
iMode は細線化のアルゴリズムを指定するパラメータです。
  • 0のとき・・Hilditchのアルゴリズムを採用します
  • 1のとき・・Deutschのアルゴリズムを採用します
Hilditchのアルゴリズムは、8連結の連結性で細線化します。有名なアルゴリズムです。 Deutschのアルゴリズムは、連結性は不定(4または8連結)で、孤立点や正方矩形などが細線化処理の結果消えてしまう場合があります。線が交差する場所での歪みがHilditchよりも少ないという報告もあります。 両アルゴリズムに関して上記以外の違いは詳細に評価していないので不明ですが、得られる処理結果はだいたい同じだと考えてよいと思います。 Hilditchのアルゴリズムは隣接画素の処理結果を踏まえて注目画素の細線化判定を行うタイプのアルゴリズムのため並列化できませんが、 Deutschのアルゴリズムは各画素毎に独立して細線化判定できるので並列化でき、ハード処理による高速化が考えやすいです。

引数:
[in] hsrc 処理対象画像( type: bin )
[out] hdst 処理結果画像( type: bin )
[in] color_mode 細線化する領域の色(0:値が0の領域を細線化、0以外:値が1の領域を細線化)
[in] iMode 細線化アルゴリズム指定(0:hilditch,1:deutsch)
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参考文献:
  • 森 俊二/坂倉栂子 共著:"画像認識の基礎 [1] -前処理と形の特徴抽出-" オーム社 1986年 4章
  • Deutsch E.S. ,"Thinning Algorithms on Rectangular, Hexagonal, and Triangular Arrays", CACM(15), No. 9, September 1972, pp. 827-837
処理結果例:
以下の処理結果、Hilditchのアルゴリズム採用の場合です。
fie_thinning_abc.png

入力画像

fie_thinning_abc_r.png

処理結果画像

INT FVALGAPI fnFIE_trimmed_averageMxN ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  size_m,
INT  size_n,
DOUBLE  rate_high,
DOUBLE  rate_low,
INT  border_mode,
DOUBLE  border_value 
)

中間項平均化フィルタ(MxN)

任意のフィルタサイズ(M×N)において、フィルタ内の濃度値をソートし、大きい値側と小さい値側から指定された個数だけ除外した平均化フィルタを施します。 フィルタのアンカー位置は、フィルタの中央となります。

除外する個数は、フィルタ範囲(MxN個)に対する割合でそれぞれ指定します。除外される個数が小数となる場合は、小数点以下を切り捨てして計算されます。
例)
フィルタサイズ:5x5(25)、除外する割合:大:0.1、小:0.1、除外する個数:4(大:2、小:2)
フィルタサイズ:5x5(25)、除外する割合:大:0.6、小:0.1、除外する個数:17(大:15、小:2)

特定の割合の場合、以下のように処理されます。

  • 割合の合計が 1.0 以上の場合は、パラメータエラーを出力する
  • 割合がともに 0.0 の場合は、通常の平均化フィルタとなる

フィルタサイズは下記の条件を満たしている必要があります。

  • フィルタの幅と高さが共に1以上の奇数である
  • フィルタのサイズは画像サイズ以下である

入力画像と出力画像は下記の条件を満たしている必要があります。

  • サイズ(幅・高さ)、チャネル数、画像の型が等しい
  • 画像の型は F_IMG_UC8 である

ボーダー処理モードがF_BORDER_NONEの時、

  • 画像の左右$ \lfloor \frac{m}{2} \rfloor$画素
  • 画像の上下$ \lfloor \frac{n}{2} \rfloor$画素

は処理されません。 ボーダー処理モードがF_BORDER_NONE以外の時、入力画像を指定のモードでボーダー拡張しフィルタ処理を施します。 この時、出力画像の領域全面でフィルタ処理結果が得られます。 ボーダー拡張の詳細な仕様は fnFIE_copy_border() を参照して下さい。

なお、指定したフィルタのサイズが幅、高さ共に1であった場合は、単に入力画像をコピーして出力する処理となります。 その際、ボーダー処理の指定と範囲指定は全て無視されます。

引数:
[in] hsrc 入力画像 ( type: uc8 )
[out] hdst 出力画像 ( type: uc8 )
[in] size_m フィルタの幅( 水平方向 1以上画像幅以下の奇数)
[in] size_n フィルタの高さ( 垂直方向 1以上画像高さ以下の奇数)
[in] rate_high 濃度値が大きい側の割合( 0 <= rate_high < 1.0 )
[in] rate_low 濃度値が小さい側の割合( 0 <= rate_low < 1.0 )
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] border_value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は,この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_varianceMxN ( FHANDLE  hsrc,
FHANDLE  hdst,
INT  size_m,
INT  size_n,
INT  border_mode,
DOUBLE  value 
)

分散フィルタ(M×N)

任意のフィルタサイズ(M×N)において分散フィルタを施します。
設定したフィルタサイズ内の分散値を濃度値とする画像を生成します。
フィルタサイズをn 濃度値をx とすると分散値$ \sigma^2 $

\[ \sigma^2=\frac{1}{n} \sum^{n}_{i=1}x_{i}^{2} - \bar{x}^{2}\]

となります。
なお、フィルタのアンカー位置は、フィルタの中心となります。
フィルタサイズは下記の条件を満たしている必要があります。

  • フィルタの幅と高さが1以上の奇数である
  • フィルタのサイズは画像サイズ以下である

入力画像と出力画像は下記の条件を満たしている必要があります。

  • 入力画像と出力画像の幅と高さは同じである

なお、指定したフィルタのサイズが幅、高さ共に1であった場合は、定義より分散値は0になります。 そのため、すべての画素の濃度が0となった画像が出力されます。 このとき、ボーダーモードの指定はすべて無視されます。

引数:
[in] hsrc 入力画像 ( type: uc8, s16, us16, double )
[out] hdst 出力画像 ( type: double)
[in] size_m フィルタの幅( 水平方向 1以上画像幅以下の奇数)
[in] size_n フィルタの高さ( 垂直方向 1以上画像高さ以下の奇数)
[in] border_mode ボーダー処理モード。下記のいずれかを指定。
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[in] value ボーダー濃度値。
border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は,この値は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_wiener ( FHANDLE  hsrc,
FHANDLE  hdst,
F_FILTER_KERNEL_T kernel,
DOUBLE  gamma 
)

ウィーナフィルタによる画像復元

入力画像 hsrc がパラメータ kernel による2次元畳み込み処理 (fnFIE_kernel_filter()) を行って得られた画像であるとみなし、 ウィーナフィルタにより畳み込み処理を行う前の画像 hdst を復元します。

このフィルタを使用することで、既知の焦点ぼけやカメラぶれにより劣化した画像から元の画像をある程度の精度で復元することができます。

パラメータ gamma (≧ 0)により、復元の精度を調整することができます。 gamma を小さくした場合、より鮮明に画像を復元することができますが、ノイズが増幅されます。 gamma を大きくするとノイズの影響が小さくなりますが、画像復元の効果も小さくなります。

gamma の決定方法
gamma は、理想的には入力画像 hsrc に加算されるノイズのパワースペクトルと ノイズを含まない原画像(理想的な hdst )のパワースペクトルの比として画素ごとに算出されます。 しかし通常はノイズや原画像は未知です。 そこで、ノイズ量が既知の場合は (ノイズの分散値)÷(入力画像の分散値) をまず試すことを推奨します。 ノイズ量が不明であり、画像の型が F_IMG_UC8 である場合は 0.001 程度の値をお試しください。 その後は処理結果を確認し、ノイズが多い場合は値を増やし、復元精度が低い場合は値を減らしてください。
入出力画像の仕様
入力画像と出力画像は下記の条件を満たしている必要があります。
  • 幅、高さ、チャネル数、画像の型が等しい
  • 幅と高さが2以上
  • 画像の型は F_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE のいずれか
処理はチャネル毎に実行されます。
フィルタカーネルの条件
フィルタカーネルは入力画像内に収まるサイズである必要があります。 より形式的には、入力画像の幅の半分を w_half, 高さの半分を h_half (いずれも端数切り捨て)としたとき、 カーネルサイズは下記の条件を満たしている必要があります。
  • kernel->anchor_x が w_half 以下
  • kernel->anchor_y が h_half 以下
  • (kernel->size_x - kernel->anchor_x) が w_half 以下
  • (kernel->size_y - kernel->anchor_y) が h_half 以下
リンギングについて
ウィーナフィルタではリンギングと呼ばれる特有のノイズが発生することが知られています。 この影響を抑制するために、画像周辺部をぼかすなどの対策を推奨します。
飽和処理
最終的な計算結果が画像型の値有効範囲 (たとえばF_IMG_UC8なら0〜255)を超える場合は、その型の有効な値範囲で飽和処理が行われます。
覚え書き:
  • 本関数は内部で 高速フーリエ変換 を使用します。 この都合上、入出力画像の幅または高さが2のべき乗(512, 1024など)でない場合、処理速度と精度が低下します。
  • 本関数の原理上、ボーダー処理モードを指定することはできません。 ほとんどの場合で画像周辺部の復元精度は低くなります。
引数:
[in] hsrc 入力画像 (type: uc8, s16, us16, double)
[out] hdst 出力画像 (type: uc8, s16, us16, double)
[in] kernel カーネル指定構造体のポインタ
[in] gamma 復元力とノイズ量のバランスを取るための係数(0以上)
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM パラメータエラー
F_ERR_INVALID_IMAGE 不正な画像が渡された(入力と出力が合わない等)
F_ERR_NOMEMORY メモリ不足により異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
使用例:
#include <stdio.h>
#include "fie.h"

// FIE関数の異常終了時に処理終了するためのマクロ定義
#define ERROR_CHECK(expr) if ((err = (expr)) != F_ERR_NONE) { printf("err: %d, line: %d\n", err, __LINE__); goto exit; }


// 画像ぼけとノイズ付加により画像を劣化させ、ウィーナフィルタにより元の画像を復元するサンプル
INT do_weighted_blur_degradation_and_restoration()
{
    INT err = F_ERR_NONE;

    // 入力画像
    FHANDLE hsrc = NULL;
    // 劣化画像(人工的に作成)
    FHANDLE hsrc_degraded = NULL;
    // 出力画像
    FHANDLE hdst = NULL;

    // 画像パラメータ
    INT type, channels, width, height;

    // 画像ぼけを人工的に発生させるフィルタカーネル
    DOUBLE kernel_core[7 * 7] = {
        1,  6,   15,  20,  15,  6,   1,
        6,  36,  90,  120, 90,  36,  6,
        15, 90,  225, 300, 225, 90,  15,
        20, 120, 300, 400, 300, 120, 20,
        15, 90,  225, 300, 225, 90,  15,
        6,  36,  90,  120, 90,  36,  6,
        1,  6,   15,  20,  15,  6,   1,
    };
    F_FILTER_KERNEL_T kernel;
    kernel.p = &kernel_core[0];
    kernel.size_x = kernel.size_y = 7;  // フィルタサイズ
    kernel.anchor_x = kernel.anchor_y = 3;  // フィルタ中心位置
    kernel.denom = 4096;  // フィルタ分母

    // 入力画像読み込み。1チャネルまたは3チャネルの濃淡画像(F_IMG_UC8)を想定
    ERROR_CHECK( fnFIE_load_img_file("sample.png", &hsrc, F_COLOR_IMG_TYPE_UC8) );

    // 入力画像のパラメータ取得
    ERROR_CHECK( fnFIE_img_get_params(hsrc, &channels, &type, NULL, &width, &height) );

    // 劣化画像と出力画像のメモリ確保
    hsrc_degraded = fnFIE_img_root_alloc(type, channels, width, height);
    hdst = fnFIE_img_root_alloc(type, channels, width, height);

    // 劣化画像の作成(ぼけ+ノイズ)
    // 補足:ボーダー処理モードは F_BORDER_REPEAT とします。
    //    これは、ウィーナフィルタが画像の周期性を仮定しているためです。
    //    通常の画像では周期性を仮定できないことがほとんどですので、
    //    復元精度を上げるために画像の周辺部をぼかすなどの対応をお勧めします。
    ERROR_CHECK( fnFIE_kernel_filter(hsrc, hsrc_degraded, &kernel, F_BORDER_REPEAT, 0) );
    ERROR_CHECK( fnFIE_add_noise_gauss(hsrc_degraded, hsrc_degraded, 0.0, 5.0, 0) );

    // ウィーナフィルタによる画像復元
    ERROR_CHECK( fnFIE_wiener(hsrc_degraded, hdst, &kernel, 0.01));

    // 結果画像保存
    ERROR_CHECK( fnFIE_save_png("sample_weighted_blur_degraded.png", hsrc_degraded, -1) );
    ERROR_CHECK( fnFIE_save_png("sample_weighted_blur_restored.png", hdst, -1) );

exit:
    // 画像の解放
    fnFIE_free_object(hsrc);
    fnFIE_free_object(hsrc_degraded);
    fnFIE_free_object(hdst);

    return err;
}

// 画像ぶれとノイズ付加により画像を劣化させ、ウィーナフィルタにより元の画像を復元するサンプル
INT do_motion_blur_degradation_and_restoration()
{
    INT err = F_ERR_NONE;

    // 入力画像
    FHANDLE hsrc = NULL;
    // 劣化画像(人工的に作成)
    FHANDLE hsrc_degraded = NULL;
    // 出力画像
    FHANDLE hdst = NULL;

    // 画像パラメータ
    INT type, channels, width, height;

    // 画像ぶれを人工的に発生させるフィルタカーネル
    DOUBLE kernel_core[5 * 5] = {
        1, 0, 0, 0, 0,
        0, 1, 0, 0, 0,
        0, 0, 1, 0, 0,
        0, 0, 0, 1, 0,
        0, 0, 0, 0, 1,
    };
    F_FILTER_KERNEL_T kernel;
    kernel.p = &kernel_core[0];
    kernel.size_x = kernel.size_y = 5;  // フィルタサイズ
    kernel.anchor_x = kernel.anchor_y = 2;  // フィルタ中心位置
    kernel.denom = 5;  // フィルタ分母

    // 入力画像読み込み。1チャネルまたは3チャネルの濃淡画像(F_IMG_UC8)を想定
    ERROR_CHECK( fnFIE_load_img_file("sample.png", &hsrc, F_COLOR_IMG_TYPE_UC8) );

    // 入力画像のパラメータ取得
    ERROR_CHECK( fnFIE_img_get_params(hsrc, &channels, &type, NULL, &width, &height) );

    // 劣化画像と出力画像のメモリ確保
    hsrc_degraded = fnFIE_img_root_alloc(type, channels, width, height);
    hdst = fnFIE_img_root_alloc(type, channels, width, height);

    // 劣化画像の作成(ぶれ+ノイズ)
    // 補足:ボーダー処理モードは F_BORDER_REPEAT とします。
    //    これは、ウィーナフィルタが画像の周期性を仮定しているためです。
    //    通常の画像では周期性を仮定できないことがほとんどですので、
    //    復元精度を上げるために画像の周辺部をぼかすなどの対応をお勧めします。
    ERROR_CHECK( fnFIE_kernel_filter(hsrc, hsrc_degraded, &kernel, F_BORDER_REPEAT, 0) );
    ERROR_CHECK( fnFIE_add_noise_gauss(hsrc_degraded, hsrc_degraded, 0.0, 5.0, 0) );

    // ウィーナフィルタによる画像復元
    ERROR_CHECK( fnFIE_wiener(hsrc_degraded, hdst, &kernel, 0.01));

    // 結果画像保存
    ERROR_CHECK( fnFIE_save_png("sample_motion_blur_degraded.png", hsrc_degraded, -1) );
    ERROR_CHECK( fnFIE_save_png("sample_motion_blur_restored.png", hdst, -1) );

exit:
    // 画像の解放
    fnFIE_free_object(hsrc);
    fnFIE_free_object(hsrc_degraded);
    fnFIE_free_object(hdst);

    return err;
}

int main()
{
    INT err;

    // FIEライブラリのセットアップ
    fnFIE_setup();

    // 画像ぼけの除去
    err = do_weighted_blur_degradation_and_restoration();

    // 画像ぶれの除去
    if (err == F_ERR_NONE) err = do_motion_blur_degradation_and_restoration();

    // ライブラリの終了処理
    fnFIE_teardown();

    return err;
}
人工的に作成したぼけの除去例:
floppy1.png

入力画像

fie_wiener_weighted_blur_degraded.png

ぼかしとノイズを付加した入力画像

fie_wiener_weighted_blur_restored.png

復元画像

人工的に作成したぶれの除去例:
floppy1.png

入力画像

fie_wiener_motion_blur_degraded.png

ぶれとノイズを付加した入力画像

fie_wiener_motion_blur_restored.png

復元画像

参考文献:
  • 画像情報教育振興協会, "ディジタル画像処理[改訂新版]," pp.146-147, 2015.

INT FVALGAPI fnFIE_add_noise_uniform ( FHANDLE  hSrc,
FHANDLE  hDst,
DOUBLE  low,
DOUBLE  high,
UINT  seed 
)

[[OSS]] uniform noise 付加フィルタ

入力画像に [ low, high ] の区間で一様分布となるノイズを足した画像を出力します。 F_IMG_DOUBLE, F_IMG_FLOAT以外の型では、ノイズ付加後に四捨五入し、各型の上下限値にてサチュレーション処理を行います。 指定する low, high の値によっては、(結果的に)ノイズが付加されない場合もあります。 入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければなりません。

引数:
[in] hSrc 処理対象画像( type: uc8, s16, us16, double, i32, ui32, float )
[out] hDst 処理結果画像( type: uc8, s16, us16, double, i32, ui32, float )
[in] low 一様に分布する値の範囲の下限
[in] high 一様に分布する値の範囲の上限
[in] seed 擬似乱数ジェネレータの初期シード値
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_img_add(), fnFIE_generate_noise_uniform()
処理結果例:
circuit.png

入力画像

fie_noise_uniform.png

処理結果画像

INT FVALGAPI fnFIE_add_noise_gauss ( FHANDLE  hSrc,
FHANDLE  hDst,
DOUBLE  ave,
DOUBLE  var,
UINT  seed 
)

[[OSS]] gauss noise 付加フィルタ

入力画像に平均 ave 分散 var の正規分布になるノイズを足した画像を出力します。 F_IMG_DOUBLE以外の型では、ノイズ付加後に四捨五入し、各型の上下限値にてサチュレーション処理を行います。 指定する var の値によっては、(結果的に)ノイズが付加されない場合もあります。 入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければならない。

引数:
[in] hSrc 処理対象画像( type: uc8, s16, us16, double )
[out] hDst 処理結果画像( type: uc8, s16, us16, double )
[in] ave gauss分布の平均
[in] var gauss分布の分散(0.0より大きい値)
[in] seed 擬似乱数ジェネレータの初期シード値
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_generate_noise_gauss()
処理結果例:
circuit.png

入力画像

fie_noise_gauss.png

処理結果画像

INT FVALGAPI fnFIE_add_noise_salt_and_pepper ( FHANDLE  hSrc,
FHANDLE  hDst,
DOUBLE  salt_rate,
DOUBLE  salt_val,
DOUBLE  pepper_rate,
DOUBLE  pepper_val,
UINT  seed 
)

[[OSS]] salt-and-pepper noise 付加フィルタ

入力画像にsalt-and-pepperノイズを付加した画像を出力します。 各画素は salt_rate の確率で salt_val 値に書き換えられます。 同様に、各画素は pepper_rate の確率で pepper_val 値に書き換えられます。 ( salt_val 値となる画素の割合は salt_rate であるとは限りません。) F_IMG_DOUBLE以外の型では、ノイズ付加後に四捨五入し、各型の上下限値にてサチュレーション処理を行います。 指定する salt_rate, pepper_rate の値によっては、(結果的に)ノイズが付加されない場合があります。 指定する salt_val, pepper_val の値によっては salt 値と pepper 値が同じになる場合もあります。 処理対象画像が2値画像の場合、自動的に salt_val =1.0, pepper_val =0.0 となり入力した両パラメータは無視されます。 入力画像と出力画像は同じタイプ、幅、高さ、チャネル数、でなければならない。

引数:
[in] hSrc 処理対象画像( type: bin, uc8, s16, us16, double )
[out] hDst 処理結果画像( type: bin, uc8, s16, us16, double )
[in] salt_rate saltの割合( 0.0≦ salt_rate ≦1.0, salt_rate + pepper_rate ≦ 1.0 )
[in] salt_val saltの値( pepper_valsalt_val )
[in] pepper_rate pepperの割合( 0.0pepper_rate ≦ 1.0, salt_rate + pepper_rate ≦ 1.0 )
[in] pepper_val pepperの値( pepper_valsalt_val )
[in] seed 擬似乱数ジェネレータの初期シード値
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_IMAGE 画像オブジェクトの値エラー
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
circuit.png

入力画像

fie_noise_salt-and_pepper.png

処理結果画像


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