ヒストグラム計測クラス

Namespace: FVIL.Measure
Assembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)

Syntax

C#
[SerializableAttribute]
public class CFviHistogram : CFviImageParser
Visual Basic
<SerializableAttribute>
Public Class CFviHistogram
	Inherits CFviImageParser

Remarks

マルチコア対応:

このクラスの Execute()()()() メソッドは、 SetParallelNum(Int32) によって設定されたスレッド数に従って、 自動的に処理を並列化します。 マルチコア環境においては、処理を並列化する事によりレーテンシを短縮できる場合があります。 詳しくは、 SetParallelNum(Int32) の説明をご参照ください。


画像ヒストグラムを計測するクラスです。
入力画像のチャネル数が1以上の場合は、指定チャネル のヒストグラムのみを作成します。 計測結果は、Result に格納されます。 結果を格納する前に、画像種別に合わせて必要な要素数に変更されます。

対応表:
画像種別チャネル数要素数
UC81~16256
S161~1665536
US161~1665536
RGB241256
RGB321256

FVIL.ImageType.S16(16ビット符号付き整数) の場合、 ヒストグラムテーブルの最初の位置は、濃度値 System.Int16.MinValue に対応し、 最後の位置は、濃度値 System.Int16.MaxValue に対応しています。


要求する入出力画像数:
項目定数
入力画像1SrcImageCount フィールド
出力画像0DstImageCount フィールド

処理対象画像の条件:

処理対象の画像は下記の条件を満たしている必要が有ります。

  • FVIL.ImageType.UC8
  • FVIL.ImageType.S16
  • FVIL.ImageType.US16
  • FVIL.ImageType.RGB24 (x1ch)
  • FVIL.ImageType.RGB32 (x1ch)
※ RGB24/RGB32 の場合は 1チャネルの画像のみ対応します。

初期値と範囲:
プロパティ初期値範囲
Channel00~(Channel-1)
ResultCFviHistogramResult の初期値CFviHistogramResult のインスタンス

トピック:


構成:

この機能は、画像のヒストグラム計測を行う本体のクラスとデータ構造クラスで構成されます。

  • 本体(クラス)
    クラス内容
    CFviHistogram 画像のヒストグラム計測を行うクラスです。
  • データ構造
    クラスデータID内容
    CFviHistogramResult1000 ヒストグラム計測結果を格納するオブジェクトです。

[↑戻る]


クラスの使用方法:

本体のヒストグラム計測クラス(CFviHistogram)は、 計測対象の画像(CFviImage)を要求し、 計測結果を格納するオブジェクト(CFviHistogramResult)を提供します。 実行前に、計測対象の画像を SrcImages[0] に設定する必要があります。

計測対象の画像が複数チャネルを持つ場合は、計測を実行する前にチャネルを指定してください。 チャネルの指定は、 Channel プロパティを使用します。

本体の Execute()()()() メソッドを実行すると、 計測結果を CFviHistogramResult オブジェクトに格納します。 このオブジェクトは Result プロパティから取得できます。 CFviHistogramResult は、 画像オブジェクトの単一のチャネルの計測結果をテーブル形式に格納しています。 ある濃度値の計測結果を取得するには、 CFviHistogramResultItem[([( Int32])]) を使用します。

[↑戻る]

Examples

サンプルコード:

【処理対象】


【処理結果】


ソースコード:
C# Copy imageCopy
//    $Revision: 1.3 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;    // FvPluginXXXX attribute requires fvalgcli

namespace User.SampleCode
{
    public partial class Measure
    {
        /// <summary>
        /// ヒストグラム計測.
        /// </summary>
        [FvPluginExecute]
        public void Histogram()
        {
            System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod();
            Console.WriteLine("{0}.{1}", method.DeclaringType.FullName, method.Name);

            // (!) 注: サンプルの為、最大3チャネルに限定します.
            const uint    _CHANNEL_MAX = 3;

            // 1) インスタンスの準備.
            FVIL.Measure.CFviHistogram parser = new FVIL.Measure.CFviHistogram();
            FVIL.Measure.CFviHistogramResult[] result =
                {
                     new FVIL.Measure.CFviHistogramResult(),
                     new FVIL.Measure.CFviHistogramResult(),
                     new FVIL.Measure.CFviHistogramResult(),
                };
            FVIL.Data.CFviImage    src = new FVIL.Data.CFviImage();

            // 2) 処理対象画像の取り込み.
            FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/floppy_RGB.jpg", src, FVIL.PixelMode.Unpacking);

            if( !(src.Channel<=_CHANNEL_MAX) )
            {
                Console.WriteLine("Invalid channel num. ({0})", src.Channel);
                return;
            }

            // 3) 処理対象画像の有効性検査.
            if( FVIL.ErrorCode._SUCCESS != FVIL.Measure.CFviHistogram.CheckValidity( src ) )
                return;

            // 4) 画像処理準備.
            parser.SrcImages[0] = src;

            // ※ チャネル毎に処理します.
            for( int ch=0 ; ch<src.Channel ; ch++ )
            {
                // 5) パラメータ設定.
                switch( src.ImageType )
                {
                    default:
                        Console.WriteLine("Invalid image type. ({0})", src.ImageType);
                        return;
                    case FVIL.ImageType.UC8:
                        result[ch].Resize( 256 );
                        break;
                    case FVIL.ImageType.S16:
                    case FVIL.ImageType.US16:
                        result[ch].Resize(65535);
                        break;
                }
                parser.Result = result[ch];
                parser.Channel = (uint)ch;

                // 6) 画像処理実行.
                parser.Execute();
            }

            // (!) 注: サンプルの為、UC8 (256色) に限定します.
            switch( src.ImageType )
            {
                case FVIL.ImageType.UC8:
                    break;
                default:
                case FVIL.ImageType.S16:
                case FVIL.ImageType.US16:
                    Console.WriteLine("[warning] omit to save image.");
                    return;
            }

            // E) 確認用.
            {
                // 描画色.
                System.Drawing.Color[]    color =
                {
                    System.Drawing.Color.FromArgb(0xFF, 0x00, 0x00),    // R
                    System.Drawing.Color.FromArgb(0x00, 0xFF, 0x00),    // G
                    System.Drawing.Color.FromArgb(0x00, 0x00, 0xFF)        // B
                };

                // 背景(黒)
                int    horz = 256;
                int vert = 192;
                FVIL.Data.CFviImage    bg = new FVIL.Data.CFviImage( horz, vert, FVIL.ImageType.UC8, 1 );
                Rectangle rect = new Rectangle( 0, 0, horz, vert );

                // 画像表示の準備.
                FVIL.GDI.CFviDisplay display = new FVIL.GDI.CFviDisplay();
                display.Image = bg;
                display.DisplayRect = rect;

                // オーバレイの生成.
                FVIL.GDI.CFviOverlay pOverlay0 = new FVIL.GDI.CFviOverlay();
                pOverlay0.Scaling = false;
                display.Overlays.Add(pOverlay0);

                // 折れ線.
                for( int ch=0 ; ch<src.Channel ; ch++ )
                {
                    FVIL.GDI.CFviGdiPolyline poly = new FVIL.GDI.CFviGdiPolyline();
                    poly.Resize(horz);
                    poly.Close = false;    // false=開.

                    uint freq_min = result[ch].MinFrequency;
                    uint freq_max = result[ch].MaxFrequency;

                    for( int i=0 ; i<result[ch].Count ; i++ )
                    {
                        double freq = result[ch][i];
                        double ratio = freq / freq_max;
                        poly[i] = new FVIL.Data.CFviPoint(i, vert-(vert*ratio));
                    }
                    poly.Pen.Color = color[ch];

                    // 追加.
                    pOverlay0.Figures.Add( poly );
                }

                // 保存.
                FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage();
                display.SaveImage( canvas, display.DisplayRect, 1.0 );
                FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/Measure.Histogram.png", canvas);
            }
        }
    };
}


Visual Basic Copy imageCopy
'    $Revision: 1.3 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli
' FvPluginXXXX attribute requires fvalgcli
Namespace SampleCode
    Public Partial Class Measure
        ''' <summary>
        ''' ヒストグラム計測.
        ''' </summary>
        <FvPluginExecute()> _
        Public Sub Histogram()
            Dim method As System.Reflection.MethodBase = System.Reflection.MethodBase.GetCurrentMethod()
            Console.WriteLine("{0}.{1}", method.DeclaringType.FullName, method.Name)

            ' (!) 注: サンプルの為、最大3チャネルに限定します.
            Const _CHANNEL_MAX As UInteger = 3

            ' 1) インスタンスの準備.
            Dim parser As New FVIL.Measure.CFviHistogram()
            Dim result As FVIL.Measure.CFviHistogramResult() = {New FVIL.Measure.CFviHistogramResult(), New FVIL.Measure.CFviHistogramResult(), New FVIL.Measure.CFviHistogramResult()}
            Dim src As New FVIL.Data.CFviImage()

            ' 2) 処理対象画像の取り込み.
            FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/floppy_RGB.jpg", src, FVIL.PixelMode.Unpacking)

            If Not (src.Channel <= _CHANNEL_MAX) Then
                Console.WriteLine("Invalid channel num. ({0})", src.Channel)
                Return
            End If

            ' 3) 処理対象画像の有効性検査.
            If FVIL.ErrorCode._SUCCESS <> FVIL.Measure.CFviHistogram.CheckValidity(src) Then
                Return
            End If

            ' 4) 画像処理準備.
            parser.SrcImages(0) = src

            ' ※ チャネル毎に処理します.
            For ch As Integer = 0 To src.Channel - 1
                ' 5) パラメータ設定.
                Select Case src.ImageType
                    Case FVIL.ImageType.UC8
                        result(ch).Resize(256)
                        Exit Select
                    Case FVIL.ImageType.S16, FVIL.ImageType.US16
                        result(ch).Resize(65535)
                        Exit Select
                    Case Else
                        Console.WriteLine("Invalid image type. ({0})", src.ImageType)
                        Return
                End Select
                parser.Result = result(ch)
                parser.Channel = CUInt(ch)

                ' 6) 画像処理実行.
                parser.Execute()
            Next

            ' (!) 注: サンプルの為、UC8 (256色) に限定します.
            Select Case src.ImageType
                Case FVIL.ImageType.UC8
                    Exit Select
                Case FVIL.ImageType.US16
                    Console.WriteLine("[warning] omit to save image.")
                    Return
                Case FVIL.ImageType.S16
                    Console.WriteLine("[warning] omit to save image.")
                    Return
                Case Else
                    Console.WriteLine("[warning] omit to save image.")
                    Return
            End Select

            ' E) 確認用.
            If True Then
                ' 描画色.
                ' R
                ' G
                ' B
                Dim color As System.Drawing.Color() = {System.Drawing.Color.FromArgb(&HFF, &H0, &H0), System.Drawing.Color.FromArgb(&H0, &HFF, &H0), System.Drawing.Color.FromArgb(&H0, &H0, &HFF)}

                ' 背景(黒)
                Dim horz As Integer = 256
                Dim vert As Integer = 192
                Dim bg As New FVIL.Data.CFviImage(horz, vert, FVIL.ImageType.UC8, 1)
                Dim rect As New Rectangle(0, 0, horz, vert)

                ' 画像表示の準備.
                Dim display As New FVIL.GDI.CFviDisplay()
                display.Image = bg
                display.DisplayRect = rect

                ' オーバレイの生成.
                Dim pOverlay0 As New FVIL.GDI.CFviOverlay()
                pOverlay0.Scaling = False
                display.Overlays.Add(pOverlay0)

                ' 折れ線.
                For ch As Integer = 0 To src.Channel - 1
                    Dim poly As New FVIL.GDI.CFviGdiPolyline()
                    poly.Resize(horz)
                    poly.Close = False
                    ' false=開.
                    Dim freq_min As UInteger = result(ch).MinFrequency
                    Dim freq_max As UInteger = result(ch).MaxFrequency

                    For i As Integer = 0 To result(ch).Count - 1
                        Dim freq As Double = result(ch)(i)
                        Dim ratio As Double = freq / freq_max
                        poly(i) = New FVIL.Data.CFviPoint(i, vert - (vert * ratio))
                    Next
                    poly.Pen.Color = color(ch)

                    ' 追加.
                    pOverlay0.Figures.Add(poly)
                Next

                ' 保存.
                Dim canvas As New FVIL.Data.CFviImage()
                display.SaveImage(canvas, display.DisplayRect, 1.0)
                FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/Measure.Histogram.png", canvas)
            End If
        End Sub
    End Class
End Namespace

[↑戻る]

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.Measure..::..CFviHistogram

See Also