濃度投影クラス

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

Syntax

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

Remarks

画像の濃度投影を取得するクラスです。

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

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

実行結果は Result に設定されたオブジェクトに格納されます。
要素数は実行時に内部で確保されます。
Direction に指定された計測方向と計測範囲によって要素数は異なります。
計測方向が X方向 の場合、計測範囲の高さに設定されます。
計測方向が Y方向 の場合、計測範囲の幅に設定されます。


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

処理対象画像の条件:

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

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


初期値と範囲:
プロパティ初期値範囲説明
Channel00~(Channel-1)処理対象チャネル指標
DirectionXFVIL.Measure.Direction.XFVIL.Measure.Direction.Y計測方向
ResultCFviProjectionResult の初期値CFviProjectionResult のインスタンス処理結果格納用オブジェクト

Examples

下図の2値画像を2値ブローブ解析して得られたリージョンにより処理対象画像の濃度投影を取得する処理です。

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

処理時間:
    0.392 msec : FVIL.Blob.CFviBlob
    0.089 msec : FVIL.Blob.CFviBlobResult.GetBlobList
    0.037 msec : FVIL.Blob.CFviBlobList.SortList
    1.663 msec : FVIL.Measure.CFviProjection.Execute


ソースコード:
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 Projection2()
        {
            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 画像統計量.
            {
                FVIL.Measure.CFviProjectionResult result_x = new FVIL.Measure.CFviProjectionResult();
                FVIL.Measure.CFviProjection parser = new FVIL.Measure.CFviProjection(src, 0, FVIL.Measure.Direction.X, result_x);

                // 計測.
                watch.Start();
                {
                    data.BlobNo = bloblist.Numbers[0];
                    FVIL.Data.CFviRegion region = data.GetRegion();
                    parser.Execute(region, FVIL.OriginMode.Image, FVIL.Measure.FeatureType.Rect2, 0.0);
                }
                msec = watch.Stop();
                times["FVIL.Measure.CFviProjection.Execute"] = msec;

                // 出力(X 方向)
                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");
                for (int i = 0; i < result_x.Count; i++)
                {
                    FVIL.Statistics stat = result_x[i];
                    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);
                }
            }
            #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 Projection2()
            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 "画像統計量."
            If True Then
                Dim result_x As New FVIL.Measure.CFviProjectionResult()
                Dim parser As New FVIL.Measure.CFviProjection(src, 0, FVIL.Measure.Direction.X, result_x)

                ' 計測.
                watch.Start()
                If True Then
                    data.BlobNo = bloblist.Numbers(0)
                    Dim region As FVIL.Data.CFviRegion = data.GetRegion()
                    parser.Execute(region, FVIL.OriginMode.Image, FVIL.Measure.FeatureType.Rect2, 0.0)
                End If
                msec = watch.[Stop]()
                times("FVIL.Measure.CFviProjection.Execute") = msec

                ' 出力(X 方向)
                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")
                For i As Integer = 0 To result_x.Count - 1
                    Dim stat As FVIL.Statistics = result_x(i)
                    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
            End If
            '#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..::..CFviProjection

See Also