輝度統計クラス

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

Syntax

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

Remarks

画像の輝度統計を算出します。

以下のいずれかのメソッドで処理を実行できます。

入力画像の単一のチャネル(またはカラーコンポーネント)に対して処理します。
Channel で処理対象のチャネルを指定してください。
入力画像が RGB24 または RGB32 の時は、チャネル 0 の RGB カラーコンポーネントを示します。 0,1,2 はそれぞれ R,G,B を示します。

実行結果は Result に設定されたオブジェクトに格納されます。


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

処理対象画像の条件:

処理対象の画像種別は以下の通りです。

※ RGB24/RGB32 の場合は 1チャネルの画像のみ対応します。


初期値と範囲:
プロパティ初期値範囲説明
Channel00~(Channel-1)処理対象チャネル指標
ResultStatistics の初期値Statistics のインスタンス処理結果格納用オブジェクト

処理対象画像の有効性検査と有効化:
  • 入力画像の有効性検査
    このクラスの CheckValidity(CFviImage) 関数で入力画像の有効性を検査できます。 この関数はスタティックメンバですので、このクラスのインスタンスを生成せずに直接呼び出す事ができます。
  • 入出力画像の整合性検査
    このクラスの IsValid()()()() メソッドで入出力画像の整合性を検査できます。 このメソッドが false を返す場合は、前述の処理対象画像の条件を満たしていない為、 実行できない事を意味します。
  • 出力画像の有効化
    このクラスでは有効化はサポートしていません。
    Validate()()()() または Validate(Int32) メソッドを実行した場合は常に例外を発行します。

Examples

下図の2値画像を2値ブローブ解析して得られたリージョンにより処理対象画像の輝度統計を算出する処理です。

【処理対象】【2値画像】
【リージョン】

処理時間:
    0.085 msec : FVIL.Blob.CFviBlob
    0.089 msec : FVIL.Blob.CFviBlobResult.GetBlobList
    0.007 msec : FVIL.Blob.CFviBlobList.SortList
    0.166 msec : FVIL.Measure.CFviStatisticsEx

処理結果:
No.  ,Count,      Sum,     Mean,      Min,      Max,    Sigma,      Var
[000]  2320,   349602,  150.691,   75.000,  237.000,   23.030,  530.361
[001]  1967,   203810,  103.615,   75.000,  222.000,   16.912,  285.999
[002]  1874,   221519,  118.207,   75.000,  238.000,   19.180,  367.871
[003]  2341,   308658,  131.849,   75.000,  220.000,   24.010,  576.476
[004]   420,    61335,  146.036,   75.000,  236.000,   23.031,  530.430
[005]   428,    63780,  149.019,   75.000,  249.000,   29.004,  841.210
[006]   426,    53726,  126.117,   75.000,  205.000,   17.404,  302.906


ソースコード:
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode
{
    public partial class Measure
    {
        /// <summary>
        /// 輝度統計
        /// </summary>
        [FvPluginExecute]
        public void StatisticsEx()
        {
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage(Defs.TestImageDir + "/key_UC8_M.png");
            FVIL.Data.CFviImage bin = new FVIL.Data.CFviImage(Defs.TestImageDir + "/key_BIN_M.png");
            FVIL.CFviTimeCounter watch = new FVIL.CFviTimeCounter();
            double msec = 0;
            Dictionary<string, double> times = new Dictionary<string, double>();

            #region 2値ブローブ解析.
            FVIL.Blob.CFviBlobResult result = new FVIL.Blob.CFviBlobResult();
            {
                watch.Start();
                FVIL.Blob.CFviBlob parser = new FVIL.Blob.CFviBlob(bin, result);
                FVIL.Blob.CFviBlobParam param = parser.Param;
                param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG;
                parser.Execute();
                msec = watch.Stop();
                times["FVIL.Blob.CFviBlob"] = msec;
            }
            #endregion

            #region 2値ブローブ解析結果のフィルタリングとソート.
            FHANDLE hresult = result.Handle;
            FVIL.Blob.CFviBlobData data = new FVIL.Blob.CFviBlobData(hresult, 0);
            FVIL.Blob.CFviBlobList bloblist;
            {
                {
                    watch.Start();
                    FVIL.Blob.CFviBlobFilterRange[] filters = new FVIL.Blob.CFviBlobFilterRange[]
                    {
                        new FVIL.Blob.CFviBlobFilterRange(FVIL.Blob.FeatureType.AREA, 100, int.MaxValue)
                    };
                    bloblist = result.GetBlobList(filters);
                    msec = watch.Stop();
                    times["FVIL.Blob.CFviBlobResult.GetBlobList"] = msec;
                }
                {
                    watch.Start();
                    bloblist.SortList(FVIL.Blob.FeatureType.RECT1AREA, FVIL.Blob.SortDirect.Descending);
                    msec = watch.Stop();
                    times["FVIL.Blob.CFviBlobList.SortList"] = msec;
                }
            }
            #endregion

            #region 画像統計量.
            Console.WriteLine(
                "{0,-5},{1,5},{2,9},{3,9},{4,9},{5,9},{6,9},{7,9}",
                "No.", "Count", "Sum", "Mean", "Min", "Max", "Sigma", "Var");
            msec = 0;
            for (int i = 0; i < bloblist.Count; i++)
            {
                FVIL.Measure.CFviStatisticsEx parser = new FVIL.Measure.CFviStatisticsEx(src, 0);

                // 計測.
                watch.Start();
                {
                    data.BlobNo = bloblist.Numbers[i];
                    FVIL.Data.CFviRegion region = data.GetRegion();
                    parser.Execute(region, FVIL.OriginMode.Image);
                }
                msec += watch.Stop();

                FVIL.Statistics stat = parser.Result;
                Console.WriteLine(
                    "[{0:000}] {1,5:0},{2,9:0},{3,9:0.000},{4,9:0.000},{5,9:0.000},{6,9:0.000},{7,9:0.000}",
                    i, stat.Count, stat.Sum, stat.Mean, stat.Min, stat.Max, stat.Sigma, stat.Variance);
            }
            times["FVIL.Measure.CFviStatisticsEx"] = msec;
            #endregion

            Console.WriteLine("");
            foreach (KeyValuePair<string, double> item in times)
            {
                Console.WriteLine("{0,9:0.000} msec : {1}", item.Value, item.Key);
            }
        }
    }
}


Visual Basic Copy imageCopy
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Namespace SampleCode
    Partial Public Class Measure
        ''' <summary>
        ''' 輝度統計
        ''' </summary>
        <FvPluginExecute()> _
        Public Sub StatisticsEx()
            Dim src As New FVIL.Data.CFviImage(Defs.TestImageDir + "/key_UC8_M.png")
            Dim bin As New FVIL.Data.CFviImage(Defs.TestImageDir + "/key_BIN_M.png")
            Dim watch As New FVIL.CFviTimeCounter()
            Dim msec As Double = 0
            Dim times As New Dictionary(Of String, Double)()

            '#Region "2値ブローブ解析."
            Dim result As New FVIL.Blob.CFviBlobResult()
            If True Then
                watch.Start()
                Dim parser As New FVIL.Blob.CFviBlob(bin, result)
                Dim param As FVIL.Blob.CFviBlobParam = parser.Param
                param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG
                parser.Execute()
                msec = watch.[Stop]()
                times("FVIL.Blob.CFviBlob") = msec
            End If
            '#End Region

            '#Region "2値ブローブ解析結果のフィルタリングとソート."
            Dim hresult As FHANDLE = result.Handle
            Dim data As New FVIL.Blob.CFviBlobData(hresult, 0)
            Dim bloblist As FVIL.Blob.CFviBlobList
            If True Then
                If True Then
                    watch.Start()
                    Dim filters As FVIL.Blob.CFviBlobFilterRange() = New FVIL.Blob.CFviBlobFilterRange() _
                     {New FVIL.Blob.CFviBlobFilterRange(FVIL.Blob.FeatureType.AREA, 100, Integer.MaxValue)}
                    bloblist = result.GetBlobList(filters)
                    msec = watch.[Stop]()
                    times("FVIL.Blob.CFviBlobResult.GetBlobList") = msec
                End If
                If True Then
                    watch.Start()
                    bloblist.SortList(FVIL.Blob.FeatureType.RECT1AREA, FVIL.Blob.SortDirect.Descending)
                    msec = watch.[Stop]()
                    times("FVIL.Blob.CFviBlobList.SortList") = msec
                End If
            End If
            '#End Region

            '#Region "画像統計量."
            Console.WriteLine( _
             "{0,-5},{1,5},{2,9},{3,9},{4,9},{5,9},{6,9},{7,9}", _
               "No.", "Count", "Sum", "Mean", "Min", "Max", "Sigma", "Var")
            msec = 0
            For i As Integer = 0 To bloblist.Count - 1
                Dim parser As New FVIL.Measure.CFviStatisticsEx(src, 0)

                ' 計測.
                watch.Start()
                If True Then
                    data.BlobNo = bloblist.Numbers(i)
                    Dim region As FVIL.Data.CFviRegion = data.GetRegion()
                    parser.Execute(region, FVIL.OriginMode.Image)
                End If
                msec += watch.[Stop]()

                Dim stat As FVIL.Statistics = parser.Result
                Console.WriteLine( _
                 "[{0:000}] {1,5:0},{2,9:0},{3,9:0.000},{4,9:0.000},{5,9:0.000},{6,9:0.000},{7,9:0.000}", _
                 i, stat.Count, stat.Sum, stat.Mean, stat.Min, stat.Max, stat.Sigma, stat.Variance)
            Next
            times("FVIL.Measure.CFviStatisticsEx") = msec
            '#End Region

            Console.WriteLine("")
            For Each item As KeyValuePair(Of String, Double) In times
                Console.WriteLine("{0,9:0.000} msec : {1}", item.Value, item.Key)
            Next
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

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

See Also