列挙型 | |
| enum | f_allinfocus_mode { F_ALLINFOCUS_LOG = 1, F_ALLINFOCUS_DOA = 2 } |
| 全焦点画像生成の手法 [詳細] | |
関数 | |
| INT FVALGAPI | fnFIE_allinfocus (FHANDLE hstack, FHANDLE hdst_allinfocus, FHANDLE hdst_index, INT mode, DOUBLE param1, DOUBLE param2) |
| 全焦点画像生成 | |
| enum f_allinfocus_mode |
全焦点画像生成の手法
全焦点画像生成の手法を決める定数です。
| INT FVALGAPI fnFIE_allinfocus | ( | FHANDLE | hstack, | |
| FHANDLE | hdst_allinfocus, | |||
| FHANDLE | hdst_index, | |||
| INT | mode, | |||
| DOUBLE | param1, | |||
| DOUBLE | param2 | |||
| ) |
全焦点画像生成
画像スタックから全焦点画像を得ます。 カメラのピント位置を変更して撮像された同一被写体を写した複数の画像から、 各画素において、焦点が合っている画像の画素値を採用し全焦点画像を得ます。 各画像の被写体は同じ位置にある必要があります。
引数 hstack で画像スタックを指定します。 画像スタックでないオブジェクトを指定した場合、不正なオブジェクトが渡された、となります。 画像スタックは以下の条件を全て満たすものを指定して下さい。
引数 mode にて全焦点画像を得る手法を指定します。種類は以下の値にて指定してください。
LoGフィルタを利用することで合焦度が高い画素値を選択し、全焦点画像を得ます。
DoAフィルタを利用することで合焦度が高い画素値を選択し、全焦点画像を得ます。
引数 param1 はmode によって意味が異なります。
引数 param2 はmode によって意味が異なります。
F_ALLINFOCUS_DOAを選択した場合、フィルタサイズは画像のサイズ以下でなければいけません、 すなわちparam1 、 param2 は四捨五入後の整数値が、どちらも画像の幅、高さ以下の奇数でなければいけません。
またF_ALLINFOCUS_DOAを選択した場合、param1 、param2 について、四捨五入後の整数値が同じになる値を入力した場合はパラメータ異常となります。
引数 hdst_allinfocus は出力画像であり、指定された手法で計算された全焦点画像を出力します。入力画像スタックに含まれる画像と同じ型、サイズ、チャネルの画像でなければいけません。不要な場合はNULLを指定できます。
引数 hdst_index は出力画像であり、各画素において、出力全焦点画像の画素値として入力画像スタックの何枚目の画像が採用されたのかを出力します。出力画像について、入力画像スタックに含まれる画像と同じサイズで、画像型はDOUBLE型またはUC8、チャネル数は1chの画像でなければいけません。不要な場合はNULLを指定できます。 なお hdst_index がUC8型の場合は飽和処理を行った値が格納されます。
引数 hdst_allinfocus と hdst_index の両方がNULLの場合は F_ERR_INVALID_IMAGE エラーを返します。
| [in] | hstack | 入力画像スタック ( type: double, uc8 ) |
| [out] | hdst_allinfocus | 出力画像(全焦点画像) ( type: double, uc8 ) |
| [out] | hdst_index | 出力画像(インデックス画像) ( type: double, uc8 / ch: 1 ) |
| [in] | mode | 全焦点画像を得る手法。下記のいずれかを指定。
|
| [in] | param1 | パラメータ( mode によって意味が異なります ) |
| [in] | param2 | パラメータ( mode によって意味が異なります ) |
| F_ERR_NONE | 正常終了 | |
| F_ERR_INVALID_OBJECT | 不正なオブジェクトが渡された | |
| F_ERR_INVALID_IMAGE | 不正な画像ハンドルが渡された | |
| F_ERR_INVALID_PARAM | パラメータ異常 | |
| F_ERR_NOMEMORY | メモリ不足エラー | |
| F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
入力画像スタック(一枚目) |
入力画像スタック(二枚目) |
出力全焦点画像(LoG版)
|
#include "fie.h" #include "oal_aloc.h" INT do_allinfocus() { // 画像のパス const CHAR* file_names[] = { "input_img_files/00.bmp", "input_img_files/01.bmp" }; INT status = F_ERR_UNKNOWN; INT img_num = -1; FHANDLE imgstack = NULL; FHANDLE hdst_allinfocus = NULL; FHANDLE himg_temp = NULL; INT width, height; INT dst_allinfocus_type; INT dst_allinfocus_ch; INT width_temp, height_temp; INT ch_temp, type_temp; INT mode; DOUBLE param1, param2; INT i; img_num = sizeof(file_names) / sizeof(file_names[0]); if (img_num < 2) { status = F_ERR_INVALID_IMAGE; goto EXIT; } //最初の一枚目の画像読み込み(これを基準にする) { status = fnFIE_load_img_file(file_names[0], &himg_temp, F_COLOR_IMG_TYPE_UC8); if (status != F_ERR_NONE) { goto EXIT; } status = fnFIE_img_get_params(himg_temp, &ch_temp, &type_temp, NULL, &width_temp, &height_temp); if (status != F_ERR_NONE) { goto EXIT; } fnFIE_free_object(himg_temp); himg_temp = NULL; } //入力画像スタック作成 { imgstack = fnFIE_imgstack_alloc(F_IMGSTACK_ROOT_MODE, TRUE); if (imgstack == NULL) { status = F_ERR_NOMEMORY; goto EXIT; } for (i = 0; i < img_num; i++) { status = fnFIE_load_img_file(file_names[i], &himg_temp, F_COLOR_IMG_TYPE_UC8); if (status != F_ERR_NONE) { goto EXIT; } status = fnFIE_imgstack_push_back(imgstack, himg_temp); if (status != F_ERR_NONE) { goto EXIT; } fnFIE_free_object(himg_temp); himg_temp = NULL; } } //出力画像準備 { width = width_temp; height = height_temp; dst_allinfocus_ch = ch_temp; dst_allinfocus_type = type_temp; hdst_allinfocus = fnFIE_img_root_alloc(dst_allinfocus_type, dst_allinfocus_ch, width, height); if (hdst_allinfocus == NULL) { status = F_ERR_NOMEMORY; goto EXIT; } } //全焦点画像生成:mode=LoGの場合 { mode = F_ALLINFOCUS_LOG; param1 = 2.0; param2 = 0; status = fnFIE_allinfocus(imgstack, hdst_allinfocus, NULL, mode, param1, param2); if (status != F_ERR_NONE) { goto EXIT; } //結果画像保存 status = fnFIE_save_png("allinfocus_LoG.png", hdst_allinfocus, -1); if (status != F_ERR_NONE) { goto EXIT; } } EXIT: fnFIE_free_object(imgstack); fnFIE_free_object(hdst_allinfocus); fnFIE_free_object(himg_temp); return status; } INT main() { INT status = F_ERR_UNKNOWN; // FIEライブラリのセットアップ fnFIE_setup(); //全焦点画像生成 status = do_allinfocus(); // ライブラリの終了処理 fnFIE_teardown(); return status; }