2次元実数画像を順方向フーリエ変換する

Namespace: fvalgcli
Assembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)

Syntax

C#
public static int fnFIE_fft2_fwd_RealtoDD(
	FHANDLE hFFT,
	FHANDLE hSrcRe,
	FHANDLE hDstRe,
	FHANDLE hDstIm
)
Visual Basic
Public Shared Function fnFIE_fft2_fwd_RealtoDD ( 
	hFFT As FHANDLE,
	hSrcRe As FHANDLE,
	hDstRe As FHANDLE,
	hDstIm As FHANDLE
) As Integer

Parameters

hFFT
Type: fvalgcli..::..FHANDLE
FFTハンドル
hSrcRe
Type: fvalgcli..::..FHANDLE
空間領域2次元実数画像のハンドル ( type: uc8, us16, s16, double )
hDstRe
Type: fvalgcli..::..FHANDLE
周波数領域2次元複素数出力データの実部画像のハンドル ( type: double )
hDstIm
Type: fvalgcli..::..FHANDLE
周波数領域2次元複素数出力データの虚部画像のハンドル ( type: double )

Return Value

Type: Int32
以下のエラーコードを返します。

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_INVALID_OBJECT hFFT , hSrcRe , hDstRe , hDstIm の いずれかに IntPtr.Zero が渡された
F_ERR_INVALID_PARAMhFFT が F_OBJID_FFTSPEC 型ではない
F_ERR_INVALID_IMAGE
  • hSrcRe , hDstRe , hDstIm のいずれかが不正なハンドル
  • hDstRe , hDstIm のいずれか型が F_IMG_DOUBLE でない
  • hSrcRe の型が F_IMG_UC8, F_IMG_US16, F_IMG_S16, F_IMG_DOUBLE のいずれでもない。
  • hSrcRe , hDstRe , hDstIm の 幅、高さ、チャネル数 が異なっている
  • hSrcRe , hDstRe , hDstIm の幅又は高さが1である
F_ERR_FFT_INVALID_SPEC hFFT ハンドルは入力画像のFFTに適用できない。
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Examples

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace TC
{
    public partial class FIE
    {
        /// <summary>
        /// 2次元実数画像の順方向フーリエ変換.
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_fft2_fwd_RealtoDD()
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE hTmp = FHANDLE.Zero;        // 入力画像.
            FHANDLE hDataDstRe = FHANDLE.Zero;    // 出力データの実部.
            FHANDLE hDataDstIm = FHANDLE.Zero;    // 出力データの虚部.
            FHANDLE hFFT = FHANDLE.Zero;        // FFTハンドル.

            try
            {
                // 入力画像ファイルのロード.        
                status = api.fnFIE_load_raw(TestImageDir + "/testdata/fie_fft_img2.raw", ref hTmp, (int)f_imgtype.F_IMG_DOUBLE, 0, sizeof(Double) * 64 * 2, 64 * 2, 32, new IntPtr(0));
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_load_raw: エラーが発生しました。({0})", (f_err)status);


                //入力画像情報取得.
                int width = api.fnFIE_img_get_width(hTmp);
                int height = api.fnFIE_img_get_height(hTmp);
                int type = api.fnFIE_img_get_type(hTmp);
                int channels = api.fnFIE_img_get_channels(hTmp);

                // 出力データの画像オブジェクトの生成.
                hDataDstRe = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_DOUBLE, 1, width, height);
                hDataDstIm = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_DOUBLE, 1, width, height);
                Assert.IsTrue(hDataDstRe != FHANDLE.Zero, "hDataDstRe が異常です.");
                Assert.IsTrue(hDataDstIm != FHANDLE.Zero, "hDataDstIm が異常です.");

                // FFTハンドルを初期化.
                status = api.fnFIE_fft_2D_alloc(ref hFFT, width, height,
                    f_fft_direction.F_FFT_FORWARD,
                    f_fft_normalize_type.F_FFT_DIV_BY_SQRTN,
                    f_fft_data_type.F_2D_FFT_REAL,
                    f_fft_data_type.F_2D_FFT_DOUBLEC);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_fft_2D_alloc: エラーが発生しました。({0})", (f_err)status);

                //処理実行
                status = api.fnFIE_fft2_fwd_RealtoDD(hFFT, hTmp, hDataDstRe, hDataDstIm);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_fft2_fwd_RealtoDD: エラーが発生しました。({0})", (f_err)status);

                //保存
                api.fnFIE_save_tiff(ResultDir + "/fnFIE_fft2_fwd_RealtoDD_Src.tiff", hTmp, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0);
                api.fnFIE_save_tiff(ResultDir + "/fnFIE_fft2_fwd_RealtoDD_DstReal.tiff", hDataDstRe, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0);
                api.fnFIE_save_tiff(ResultDir + "/fnFIE_fft2_fwd_RealtoDD_DstImage.tiff", hDataDstIm, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0);
            }
            finally
            {
                //開放
                hTmp.Dispose();
                hDataDstRe.Dispose();
                hDataDstIm.Dispose();
                hFFT.Dispose();
            }
        }

        /// <summary>
        /// 2次元画像の順方向/逆方向フーリエ変換.
        /// </summary>
        /// <remarks>
        /// UC8 画像 ――順方向フーリエ変換―→ D64/D64 画像.
        /// UC8 画像 ←―逆方向フーリエ変換―― D64/D64 画像.
        ///  以上の処理で元のデータに戻る(一致する)ことを確認する.
        /// [注意] 
        /// 処理対象のデータは縦・横とも2のべき乗であること.
        /// (今回は 512*512 の画像を使用している)
        /// </remarks>
        [FvPluginExecute]
        public void fnFIE_fft2_TEST_RealtoDD_DDtoReal()
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE hImage = FHANDLE.Zero;        // 元の画像データ.
            FHANDLE hDataSrc = FHANDLE.Zero;    // (順方向フーリエ変換)入力データ.
            FHANDLE hDataDstRe = FHANDLE.Zero;    // (順方向フーリエ変換)出力データの実部.
            FHANDLE hDataDstIm = FHANDLE.Zero;    // (順方向フーリエ変換)出力データの虚部.
            FHANDLE hDataInv = FHANDLE.Zero;    // (逆方向フーリエ変換)出力データ.
            FHANDLE hFFTFwd = FHANDLE.Zero;        // (順方向フーリエ変換)FFTハンドル.
            FHANDLE hFFTInv = FHANDLE.Zero;        // (逆方向フーリエ変換)FFTハンドル.

            try
            {
                // 入力画像ファイルのロード.
                status = api.fnFIE_load_img_file(TestImageDir + "/testdata/lena512.bmp", ref hImage, f_color_img_type.F_COLOR_IMG_TYPE_UC8);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_load_img_file: エラーが発生しました。({0})", (f_err)status);

                //入力画像情報取得.
                int width = api.fnFIE_img_get_width(hImage);
                int height = api.fnFIE_img_get_height(hImage);
                int type = api.fnFIE_img_get_type(hImage);
                int channels = api.fnFIE_img_get_channels(hImage);

                // (順方向フーリエ変換)入力データの確保.    
                hDataSrc = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_UC8, channels, width, height);
                Assert.IsTrue(hDataSrc != FHANDLE.Zero, "hDataSrc が異常です.");

                // 画像コピー(UC8 to UC8).
                status = api.fnFIE_img_copy(hImage, hDataSrc);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_img_copy: エラーが発生しました。({0})", (f_err)status);

                // (順方向フーリエ変換)出力データの画像オブジェクトの生成.
                hDataDstRe = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_DOUBLE, 1, width, height);
                hDataDstIm = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_DOUBLE, 1, width, height);
                Assert.IsTrue(hDataDstRe != FHANDLE.Zero, "hDataDstRe が異常です.");
                Assert.IsTrue(hDataDstIm != FHANDLE.Zero, "hDataDstIm が異常です.");

                // (順方向フーリエ変換)FFTハンドルの初期化.
                status = api.fnFIE_fft_2D_alloc(ref hFFTFwd, width, height,
                    f_fft_direction.F_FFT_FORWARD,
                    f_fft_normalize_type.F_FFT_DIV_BY_SQRTN,
                    f_fft_data_type.F_2D_FFT_REAL,
                    f_fft_data_type.F_2D_FFT_DOUBLEC);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, " (順方向フーリエ変換)FFTハンドルの初期化: エラーが発生しました。({0})", (f_err)status);

                // 順方向フーリエ変換の実行
                status = api.fnFIE_fft2_fwd_RealtoDD(hFFTFwd, hDataSrc, hDataDstRe, hDataDstIm);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_fft2_fwd_RealtoDD: エラーが発生しました。({0})", (f_err)status);

                // (逆フーリエ変換)出力データの画像オブジェクトの生成.
                hDataInv = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_UC8, channels, width, height);
                Assert.IsTrue(hDataInv != FHANDLE.Zero, "hDataInv が異常です.");

                // (逆フーリエ変換)FFTハンドルの初期化.
                status = api.fnFIE_fft_2D_alloc(ref hFFTInv, width, height,
                    f_fft_direction.F_FFT_INVERSE,
                    f_fft_normalize_type.F_FFT_DIV_BY_SQRTN,
                    f_fft_data_type.F_2D_FFT_REAL,
                    f_fft_data_type.F_2D_FFT_DOUBLEC);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "(逆フーリエ変換)FFTハンドルの初期化: エラーが発生しました。({0})", (f_err)status);

                // 逆フーリエ変換の実行
                status = api.fnFIE_fft2_inv_DDtoReal(hFFTInv, hDataDstRe, hDataDstIm, hDataInv, 1.0);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_fft2_inv_DDtoReal: エラーが発生しました。({0})", (f_err)status);

                // 確認
                {
                    bool result = false;
                    status = api.fnFIE_img_compare(hDataSrc, hDataInv, ref result);
                    Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_img_compare: エラーが発生しました。({0})", (f_err)status);
                    Assert.IsTrue(true == result, "元の画像と一致しません");
                }

                //保存
                api.fnFIE_save_tiff(ResultDir + "/fnFIE_fft2_TEST_Re.tiff", hDataDstRe, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0);
                api.fnFIE_save_tiff(ResultDir + "/fnFIE_fft2_TEST_Im.tiff", hDataDstIm, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0);
                api.fnFIE_save_tiff(ResultDir + "/fnFIE_fft2_TEST_Inv.tiff", hDataInv, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0);
            }
            finally
            {
                //開放
                hImage.Dispose();
                hDataSrc.Dispose();
                hDataDstRe.Dispose();
                hDataDstIm.Dispose();
                hDataInv.Dispose();
                hFFTFwd.Dispose();
                hFFTInv.Dispose();
            }
        }

    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Runtime.InteropServices
Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Public Partial Class FIE
    ''' <summary>
    ''' 2次元実数画像の順方向フーリエ変換.
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_fft2_fwd_RealtoDD()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim hTmp As FHANDLE = FHANDLE.Zero
        ' 入力画像.
        Dim hDataDstRe As FHANDLE = FHANDLE.Zero
        ' 出力データの実部.
        Dim hDataDstIm As FHANDLE = FHANDLE.Zero
        ' 出力データの虚部.
        Dim hFFT As FHANDLE = FHANDLE.Zero
        ' FFTハンドル.
        Try
            ' 入力画像ファイルのロード.        
            status = api.fnFIE_load_raw(TestImageDir & "/testdata/fie_fft_img2.raw", hTmp, CInt(f_imgtype.F_IMG_DOUBLE), 0, Marshal.SizeOf(GetType(Double)) * 64 * 2, 64 * 2, _
                32, New IntPtr(0))
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_load_raw: エラーが発生しました。({0})", CType(status, f_err))


            '入力画像情報取得.
            Dim width As Integer = api.fnFIE_img_get_width(hTmp)
            Dim height As Integer = api.fnFIE_img_get_height(hTmp)
            Dim type As Integer = api.fnFIE_img_get_type(hTmp)
            Dim channels As Integer = api.fnFIE_img_get_channels(hTmp)

            ' 出力データの画像オブジェクトの生成.
            hDataDstRe = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_DOUBLE), 1, width, height)
            hDataDstIm = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_DOUBLE), 1, width, height)
            Assert.IsTrue(hDataDstRe <> FHANDLE.Zero, "hDataDstRe が異常です.")
            Assert.IsTrue(hDataDstIm <> FHANDLE.Zero, "hDataDstIm が異常です.")

            ' FFTハンドルを初期化.
            status = api.fnFIE_fft_2D_alloc(hFFT, width, height, f_fft_direction.F_FFT_FORWARD, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_2D_FFT_REAL, _
                f_fft_data_type.F_2D_FFT_DOUBLEC)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_fft_2D_alloc: エラーが発生しました。({0})", CType(status, f_err))

            '処理実行
            status = api.fnFIE_fft2_fwd_RealtoDD(hFFT, hTmp, hDataDstRe, hDataDstIm)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_fft2_fwd_RealtoDD: エラーが発生しました。({0})", CType(status, f_err))

            '保存
            api.fnFIE_save_tiff(ResultDir & "/fnFIE_fft2_fwd_RealtoDD_Src.tiff", hTmp, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0)
            api.fnFIE_save_tiff(ResultDir & "/fnFIE_fft2_fwd_RealtoDD_DstReal.tiff", hDataDstRe, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0)
            api.fnFIE_save_tiff(ResultDir & "/fnFIE_fft2_fwd_RealtoDD_DstImage.tiff", hDataDstIm, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0)
        Finally
            '開放
            hTmp.Dispose()
            hDataDstRe.Dispose()
            hDataDstIm.Dispose()
            hFFT.Dispose()
        End Try
    End Sub

    ''' <summary>
    ''' 2次元画像の順方向/逆方向フーリエ変換.
    ''' </summary>
    ''' <remarks>
    ''' UC8 画像 ――順方向フーリエ変換―→ D64/D64 画像.
    ''' UC8 画像 ←―逆方向フーリエ変換―― D64/D64 画像.
    '''  以上の処理で元のデータに戻る(一致する)ことを確認する.
    ''' [注意] 
    ''' 処理対象のデータは縦・横とも2のべき乗であること.
    ''' (今回は 512*512 の画像を使用している)
    ''' </remarks>
    <FvPluginExecute> _
    Public Sub fnFIE_fft2_TEST_RealtoDD_DDtoReal()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim hImage As FHANDLE = FHANDLE.Zero
        ' 元の画像データ.
        Dim hDataSrc As FHANDLE = FHANDLE.Zero
        ' (順方向フーリエ変換)入力データ.
        Dim hDataDstRe As FHANDLE = FHANDLE.Zero
        ' (順方向フーリエ変換)出力データの実部.
        Dim hDataDstIm As FHANDLE = FHANDLE.Zero
        ' (順方向フーリエ変換)出力データの虚部.
        Dim hDataInv As FHANDLE = FHANDLE.Zero
        ' (逆方向フーリエ変換)出力データ.
        Dim hFFTFwd As FHANDLE = FHANDLE.Zero
        ' (順方向フーリエ変換)FFTハンドル.
        Dim hFFTInv As FHANDLE = FHANDLE.Zero
        ' (逆方向フーリエ変換)FFTハンドル.
        Try
            ' 入力画像ファイルのロード.
            status = api.fnFIE_load_img_file(TestImageDir & "/testdata/lena512.bmp", hImage, f_color_img_type.F_COLOR_IMG_TYPE_UC8)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_load_img_file: エラーが発生しました。({0})", CType(status, f_err))

            '入力画像情報取得.
            Dim width As Integer = api.fnFIE_img_get_width(hImage)
            Dim height As Integer = api.fnFIE_img_get_height(hImage)
            Dim type As Integer = api.fnFIE_img_get_type(hImage)
            Dim channels As Integer = api.fnFIE_img_get_channels(hImage)

            ' (順方向フーリエ変換)入力データの確保.    
            hDataSrc = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_UC8), channels, width, height)
            Assert.IsTrue(hDataSrc <> FHANDLE.Zero, "hDataSrc が異常です.")

            ' 画像コピー(UC8 to UC8).
            status = api.fnFIE_img_copy(hImage, hDataSrc)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_img_copy: エラーが発生しました。({0})", CType(status, f_err))

            ' (順方向フーリエ変換)出力データの画像オブジェクトの生成.
            hDataDstRe = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_DOUBLE), 1, width, height)
            hDataDstIm = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_DOUBLE), 1, width, height)
            Assert.IsTrue(hDataDstRe <> FHANDLE.Zero, "hDataDstRe が異常です.")
            Assert.IsTrue(hDataDstIm <> FHANDLE.Zero, "hDataDstIm が異常です.")

            ' (順方向フーリエ変換)FFTハンドルの初期化.
            status = api.fnFIE_fft_2D_alloc(hFFTFwd, width, height, f_fft_direction.F_FFT_FORWARD, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_2D_FFT_REAL, _
                f_fft_data_type.F_2D_FFT_DOUBLEC)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), " (順方向フーリエ変換)FFTハンドルの初期化: エラーが発生しました。({0})", CType(status, f_err))

            ' 順方向フーリエ変換の実行
            status = api.fnFIE_fft2_fwd_RealtoDD(hFFTFwd, hDataSrc, hDataDstRe, hDataDstIm)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_fft2_fwd_RealtoDD: エラーが発生しました。({0})", CType(status, f_err))

            ' (逆フーリエ変換)出力データの画像オブジェクトの生成.
            hDataInv = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_UC8), channels, width, height)
            Assert.IsTrue(hDataInv <> FHANDLE.Zero, "hDataInv が異常です.")

            ' (逆フーリエ変換)FFTハンドルの初期化.
            status = api.fnFIE_fft_2D_alloc(hFFTInv, width, height, f_fft_direction.F_FFT_INVERSE, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_2D_FFT_REAL, _
                f_fft_data_type.F_2D_FFT_DOUBLEC)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "(逆フーリエ変換)FFTハンドルの初期化: エラーが発生しました。({0})", CType(status, f_err))

            ' 逆フーリエ変換の実行
            status = api.fnFIE_fft2_inv_DDtoReal(hFFTInv, hDataDstRe, hDataDstIm, hDataInv, 1.0)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_fft2_inv_DDtoReal: エラーが発生しました。({0})", CType(status, f_err))

            ' 確認
            If True Then
                Dim result As Boolean = False
                status = api.fnFIE_img_compare(hDataSrc, hDataInv, result)
                Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_img_compare: エラーが発生しました。({0})", CType(status, f_err))
                Assert.IsTrue(True = result, "元の画像と一致しません")
            End If

            '保存
            api.fnFIE_save_tiff(ResultDir & "/fnFIE_fft2_TEST_Re.tiff", hDataDstRe, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0)
            api.fnFIE_save_tiff(ResultDir & "/fnFIE_fft2_TEST_Im.tiff", hDataDstIm, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0)
            api.fnFIE_save_tiff(ResultDir & "/fnFIE_fft2_TEST_Inv.tiff", hDataInv, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0)
        Finally
            '開放
            hImage.Dispose()
            hDataSrc.Dispose()
            hDataDstRe.Dispose()
            hDataDstIm.Dispose()
            hDataInv.Dispose()
            hFFTFwd.Dispose()
            hFFTInv.Dispose()
        End Try
    End Sub

End Class

See Also