画像ヒストグラム作成

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

Syntax

C#
public static int fnFIE_make_histogram(
	FHANDLE hImg,
	int iChaNo,
	ref UINT_PTR unppHist,
	ref int ipHistLen
)
Visual Basic
Public Shared Function fnFIE_make_histogram ( 
	hImg As FHANDLE,
	iChaNo As Integer,
	ByRef unppHist As UINT_PTR,
	ByRef ipHistLen As Integer
) As Integer

Parameters

hImg
Type: fvalgcli..::..FHANDLE
入力画像のハンドル (type: uc8, s16, us16)
iChaNo
Type: System..::..Int32
処理したいチャネルの番号
unppHist
Type: fvalgcli..::..UINT_PTR%
ヒストグラムのメモリ。(外部で確保したメモリのアドレス、または IntPtr.Zero を指定します。)
ipHistLen
Type: System..::..Int32%
メモリ確保した場合はそのメモリの量を入力(UINT数単位)。 メモリ確保しなかった場合は関数内部確保のメモリの量を出力(UINT数単位)。

Return Value

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

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_NOMEMORYメモリ不足で確保に失敗した
F_ERR_INVALID_IMAGE不正な画像が渡された
F_ERR_INVALID_PARAMパラメータ不正
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Remarks

Examples

C# Copy imageCopy
//    $Revision: 1.1 $

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

namespace TC
{
    public partial class FIE
    {
        /// <summary>
        /// ヒストグラム計測 (メモリ外部確保版)
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_make_histogram()
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE hImg = FHANDLE.Zero;    // 入力画像.
            const int iChaNo = 0;            // 処理したいチャネルの番号.
            int ipHistLen = 256;            // メモリの量.
            UINT_PTR unppHist = UINT_PTR.alloc(ipHistLen);    // ヒストグラムのメモリ.

            try
            {
                // 入力画像を読み込む.
                api.fnFIE_load_bmp(TestImageDir + "/testdata/lena256.bmp", ref hImg, f_color_img_type.F_COLOR_IMG_TYPE_UC8);

                // 画像ヒストグラム作成.
                status = api.fnFIE_make_histogram(hImg, iChaNo, ref unppHist, ref ipHistLen);

                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_make_histogram: エラーが発生しました。({0})", (f_err)status);
                Console.WriteLine("fnFIE_make_histogram");
            }
            finally
            {
                hImg.Dispose();
                unppHist.Dispose();
            }
        }

        /// <summary>
        /// ヒストグラム計測 (メモリ内部確保版)
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_make_histogram2()
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE hImg = FHANDLE.Zero;        // 入力画像.
            const int iChaNo = 0;            // 処理したいチャネルの番号.
            int ipHistLen = 0;                // メモリの量.
            UINT_PTR unppHist = UINT_PTR.Zero;    // ヒストグラムのメモリ.

            try
            {
                // 入力画像を読み込む.
                api.fnFIE_load_bmp(TestImageDir + "/testdata/lena256.bmp", ref hImg, f_color_img_type.F_COLOR_IMG_TYPE_UC8);

                // 画像ヒストグラム作成.
                status = api.fnFIE_make_histogram(hImg, iChaNo, ref unppHist, ref ipHistLen);

                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 結果を出力する.
                ConsoleOut.WriteFunctionName(":");
                Console.Write("\tipHistLen = {0} ...", ipHistLen);
                ConsoleOut.IsTrue(ipHistLen == 256);
            }
            finally
            {
                hImg.Dispose();
                unppHist.Dispose();
            }
        }
    }

    /// <summary>
    /// ヒストグラムアクセス用クラス.
    /// </summary>
    internal class hist_access
    {
        /// <summary>
        /// 任意サイズの画像 Img に、ヒストグラム pHist を書き込む.
        /// </summary>
        /// <param name="Img"></param>
        /// <param name="pHist"></param>
        /// <param name="HistLen"></param>
        public static void to_img(FHANDLE Img, UINT_PTR pHist, int HistLen)
        {
            FHANDLE tmpImg = FHANDLE.Zero;
            FMATRIX_PTR mat = FMATRIX_PTR.Zero;
            DOUBLE_PTR pline_val = DOUBLE_PTR.Zero;

            try
            {
                uint max_val = 0;
                for (int i = 0; i < HistLen; i++)
                {
                    uint val = pHist[i];
                    if (max_val < val)
                        max_val = val;
                }

                int tmp_width = HistLen;
                int tmp_height = (int)max_val + 1;

                tmpImg = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_UC8, 1, tmp_width, tmp_height);
                api.fnFIE_img_clear(tmpImg, 255);

                for (int i = 0; i < HistLen; i++)
                {
                    double[] line_val = { 0 };
                    pline_val = Marshal.UnsafeAddrOfPinnedArrayElement(line_val, 0);

                    DPNT_T start, end;
                    start.x = end.x = i;
                    start.y = max_val;
                    end.y = max_val - pHist[i];
                    api.fnFIE_draw_line_seg(tmpImg, pline_val, start, end);
                }

                int width = api.fnFIE_img_get_width(Img);
                int height = api.fnFIE_img_get_height(Img);

                mat = api.fnFIE_mat_aalloc(3, 3);

                api.fnFIE_geotrans_calc_scale_matrix(mat, (double)width / tmp_width, (double)height / tmp_height);
                api.fnFIE_geotrans_affine(tmpImg, Img, FHANDLE.Zero, mat, false, f_sampling_mode.F_SAMPLING_BILINEAR);
            }
            finally
            {
                tmpImg.Dispose();
                mat.Dispose();
                pline_val.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

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

Public Partial Class FIE
    ''' <summary>
    ''' ヒストグラム計測 (メモリ外部確保版)
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_make_histogram()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim hImg As FHANDLE = FHANDLE.Zero
        ' 入力画像.
        Const  iChaNo As Integer = 0
        ' 処理したいチャネルの番号.
        Dim ipHistLen As Integer = 256
        ' メモリの量.
        Dim unppHist As UINT_PTR = UINT_PTR.alloc(ipHistLen)
        ' ヒストグラムのメモリ.
        Try
            ' 入力画像を読み込む.
            api.fnFIE_load_bmp(TestImageDir & "/testdata/lena256.bmp", hImg, f_color_img_type.F_COLOR_IMG_TYPE_UC8)

            ' 画像ヒストグラム作成.
            status = api.fnFIE_make_histogram(hImg, iChaNo, unppHist, ipHistLen)

            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_make_histogram: エラーが発生しました。({0})", CType(status, f_err))
            Console.WriteLine("fnFIE_make_histogram")
        Finally
            hImg.Dispose()
            unppHist.Dispose()
        End Try
    End Sub

    ''' <summary>
    ''' ヒストグラム計測 (メモリ内部確保版)
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_make_histogram2()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        Dim hImg As FHANDLE = FHANDLE.Zero
        ' 入力画像.
        Const  iChaNo As Integer = 0
        ' 処理したいチャネルの番号.
        Dim ipHistLen As Integer = 0
        ' メモリの量.
        Dim unppHist As UINT_PTR = UINT_PTR.Zero
        ' ヒストグラムのメモリ.
        Try
            ' 入力画像を読み込む.
            api.fnFIE_load_bmp(TestImageDir & "/testdata/lena256.bmp", hImg, f_color_img_type.F_COLOR_IMG_TYPE_UC8)

            ' 画像ヒストグラム作成.
            status = api.fnFIE_make_histogram(hImg, iChaNo, unppHist, ipHistLen)

            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 結果を出力する.
            ConsoleOut.WriteFunctionName(":")
            Console.Write(vbTab & "ipHistLen = {0} ...", ipHistLen)
            ConsoleOut.IsTrue(ipHistLen = 256)
        Finally
            hImg.Dispose()
            unppHist.Dispose()
        End Try
    End Sub
End Class

''' <summary>
''' ヒストグラムアクセス用クラス.
''' </summary>
Friend Class hist_access
    ''' <summary>
    ''' 任意サイズの画像 Img に、ヒストグラム pHist を書き込む.
    ''' </summary>
    ''' <param name="Img"></param>
    ''' <param name="pHist"></param>
    ''' <param name="HistLen"></param>
    Public Shared Sub to_img(Img As FHANDLE, pHist As UINT_PTR, HistLen As Integer)
        Dim tmpImg As FHANDLE = FHANDLE.Zero
        Dim mat As FMATRIX_PTR = FMATRIX_PTR.Zero
        Dim pline_val As DOUBLE_PTR = DOUBLE_PTR.Zero

        Try
            Dim max_val As UInteger = 0
            For i As Integer = 0 To HistLen - 1
                Dim val As UInteger = pHist(i)
                If max_val < val Then
                    max_val = val
                End If
            Next

            Dim tmp_width As Integer = HistLen
            Dim tmp_height As Integer = CInt(max_val) + 1

            tmpImg = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_UC8), 1, tmp_width, tmp_height)
            api.fnFIE_img_clear(tmpImg, 255)

            For i As Integer = 0 To HistLen - 1
                Dim line_val As Double() = {0}
                pline_val = Marshal.UnsafeAddrOfPinnedArrayElement(line_val, 0)

                Dim start As DPNT_T, [end] As DPNT_T
                start.x = InlineAssignHelper([end].x, i)
                start.y = max_val
                [end].y = max_val - pHist(i)
                api.fnFIE_draw_line_seg(tmpImg, pline_val, start, [end])
            Next

            Dim width As Integer = api.fnFIE_img_get_width(Img)
            Dim height As Integer = api.fnFIE_img_get_height(Img)

            mat = api.fnFIE_mat_aalloc(3, 3)

            api.fnFIE_geotrans_calc_scale_matrix(mat, CDbl(width) / tmp_width, CDbl(height) / tmp_height)
            api.fnFIE_geotrans_affine(tmpImg, Img, FHANDLE.Zero, mat, False, f_sampling_mode.F_SAMPLING_BILINEAR)
        Finally
            tmpImg.Dispose()
            mat.Dispose()
            pline_val.Dispose()
        End Try
    End Sub
    Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
        target = value
        Return value
    End Function
End Class

See Also