周波数領域複素数画像の強度と角度を計算する

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

Syntax

C#
public static int fnFIE_fft2_get_mag_and_phase_DD(
	FHANDLE hImgRe,
	FHANDLE hImgIm,
	FHANDLE hMag,
	FHANDLE hPhase
)
Visual Basic
Public Shared Function fnFIE_fft2_get_mag_and_phase_DD ( 
	hImgRe As FHANDLE,
	hImgIm As FHANDLE,
	hMag As FHANDLE,
	hPhase As FHANDLE
) As Integer

Parameters

hImgRe
Type: fvalgcli..::..FHANDLE
周波数領域の入力複素数画像の実部画像のハンドル ( type: double )
hImgIm
Type: fvalgcli..::..FHANDLE
周波数領域の入力複素数画像の虚部画像のハンドル ( type: double )
hMag
Type: fvalgcli..::..FHANDLE
強度画像のハンドル ( type: double ) ※不要な場合は IntPtr.Zero を指定。
hPhase
Type: fvalgcli..::..FHANDLE
角度画像のハンドル ( type: double ) ※不要な場合は IntPtr.Zero を指定。※角度の範囲は -PI~PI。

Return Value

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

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_INVALID_IMAGE
  • hImgRe 又は hImgIm が IntPtr.Zero
  • hMag と hPhase が両方とも IntPtr.Zero
  • hImgRe , hImgIm , hMag , hPhase のいずれかの画像型が F_IMG_DOUBLE でない
  • hImgRe , hImgIm , hMag , hPhase の幅、高さ、チャネル数が同じでない
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>
        /// 周波数領域複素数画像の強度と角度の計算.
        /// </summary>
        /// <remarks>
        /// 2次元実数画像の順方向フーリエ変換により周波数領域の複素数画像を取得し,
        /// この画像から強度と角度を計算する.
        /// </remarks>
        [FvPluginExecute]
        public void fnFIE_fft2_get_mag_and_phase_DD()
        {
            int status = (int)f_err.F_ERR_NONE;
            int width;
            int height;
            int type;
            int channels;


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

            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);

                    //入力画像の情報取得.
                    width = api.fnFIE_img_get_width(hImage);
                    height = api.fnFIE_img_get_height(hImage);
                    type = api.fnFIE_img_get_type(hImage);
                    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);
                }

                //周波数画像の情報取得.
                width = api.fnFIE_img_get_width(hDataDstRe);
                height = api.fnFIE_img_get_height(hDataDstRe);
                type = api.fnFIE_img_get_type(hDataDstRe);
                channels = api.fnFIE_img_get_channels(hDataDstRe);

                // 強度画像、角度画像の画像オブジェクトの生成.
                hMag    = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_DOUBLE, 1, width, height);
                Assert.IsTrue(hMag != FHANDLE.Zero, "hMag が異常です.");
                hPhase = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_DOUBLE, 1, width, height);
                Assert.IsTrue(hPhase != FHANDLE.Zero, "hPhase が異常です.");

                // 周波数領域複素数画像の強度と角度の計算.
                status = api.fnFIE_fft2_get_mag_and_phase_DD(hDataDstRe, hDataDstIm, hMag, hPhase);

                //保存.
                api.fnFIE_save_tiff(ResultDir + "/fnFIE_fft2_get_DD_mag.tiff", hMag, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0);
                api.fnFIE_save_tiff(ResultDir + "/fnFIE_fft2_get_DD_phase.tiff", hPhase, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0);
            }
            finally
            {
                // オブジェクトの開放.
                hImage.Dispose();
                hDataSrc.Dispose();
                hDataDstRe.Dispose();
                hDataDstIm.Dispose();
                hFFTFwd.Dispose();
                hMag.Dispose();
                hPhase.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Public Partial Class FIE
    ''' <summary>
    ''' 周波数領域複素数画像の強度と角度の計算.
    ''' </summary>
    ''' <remarks>
    ''' 2次元実数画像の順方向フーリエ変換により周波数領域の複素数画像を取得し,
    ''' この画像から強度と角度を計算する.
    ''' </remarks>
    <FvPluginExecute> _
    Public Sub fnFIE_fft2_get_mag_and_phase_DD()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)
        Dim width As Integer
        Dim height As Integer
        Dim type As Integer
        Dim channels As Integer


        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 hFFTFwd As FHANDLE = FHANDLE.Zero
        ' (順方向フーリエ変換)FFTハンドル.
        Dim hMag As FHANDLE = FHANDLE.Zero
        ' 強度画像.
        Dim hPhase As FHANDLE = FHANDLE.Zero
        ' 角度画像.
        Try
            ' 順方向フーリエ変換.
            If True Then
                ' 入力画像ファイルのロード.
                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))

                '入力画像の情報取得.
                width = api.fnFIE_img_get_width(hImage)
                height = api.fnFIE_img_get_height(hImage)
                type = api.fnFIE_img_get_type(hImage)
                channels = 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))
            End If

            '周波数画像の情報取得.
            width = api.fnFIE_img_get_width(hDataDstRe)
            height = api.fnFIE_img_get_height(hDataDstRe)
            type = api.fnFIE_img_get_type(hDataDstRe)
            channels = api.fnFIE_img_get_channels(hDataDstRe)

            ' 強度画像、角度画像の画像オブジェクトの生成.
            hMag = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_DOUBLE), 1, width, height)
            Assert.IsTrue(hMag <> FHANDLE.Zero, "hMag が異常です.")
            hPhase = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_DOUBLE), 1, width, height)
            Assert.IsTrue(hPhase <> FHANDLE.Zero, "hPhase が異常です.")

            ' 周波数領域複素数画像の強度と角度の計算.
            status = api.fnFIE_fft2_get_mag_and_phase_DD(hDataDstRe, hDataDstIm, hMag, hPhase)

            '保存.
            api.fnFIE_save_tiff(ResultDir & "/fnFIE_fft2_get_DD_mag.tiff", hMag, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0)
            api.fnFIE_save_tiff(ResultDir & "/fnFIE_fft2_get_DD_phase.tiff", hPhase, f_tiff_compression.F_TIFF_COMPRESSION_NONE, 0)
        Finally
            ' オブジェクトの開放.
            hImage.Dispose()
            hDataSrc.Dispose()
            hDataDstRe.Dispose()
            hDataDstIm.Dispose()
            hFFTFwd.Dispose()
            hMag.Dispose()
            hPhase.Dispose()
        End Try
    End Sub
End Class

See Also