DP法による点列の折れ線化

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

Syntax

C#
[SerializableAttribute]
public class CFviVectorize2dDP : CFviObject, 
	IFviCopyable, ICloneable
Visual Basic
<SerializableAttribute>
Public Class CFviVectorize2dDP
	Inherits CFviObject
	Implements IFviCopyable, ICloneable

Remarks

点列をDP法( Ramer / Douglas Peucker algorithm )を用いて間引き、折れ線にして出力します。 始点と終点が異なる点列を与えた場合は、始点と終点を必ず出力します。 始点と終点に同じ座標の入った点列を与えた場合、 閉曲線と判断して入力点列の始点から最も遠い点を探し、 その点から最も遠い点を探して新しい始点としてから折れ線化するため 必ずしも入力点列の始点と終点を出力するとは限りませんが、 出力点列の始点と終点には同一の座標が入ります。


入力データ:

このクラスでは、入力データは Execute(PNT_T_ARRAY, Double) メソッドの引数に指定します。

引数範囲説明
src3点以上入力座標点列
threshold0 より大きい値 折れ線閾値
折れ線と点列を比較したとき点列が折れ線の方向から垂直に何ピクセル外れていたら折るかを指定します。 出力する点列は元の点列から threshold より大きく外れません。

出力データ:
プロパティ初期値範囲説明
Points要素数 0出力座標点列
Indexes要素数 0出力座標点列のインデックス配列

アルゴリズム:
  1. 点列を用意します。
  2. 始点と終点を結ぶ線分を引き、最も遠い点から垂線をおろして長さを測ります。
  3. 垂線の長さが threshold より長かったらその点で線分を折り、残りの点のうち新たな線分から最も遠い点から垂線をおろして長さを測ります。
  4. 垂線の長さが threshold より短くなったら終了します。


関連する FIE 関数:

fnFIE_cg_vectorize2d_dp

Examples

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

namespace User.SampleCode
{
    public partial class CG
    {
        /// <summary>
        /// DP法による点列の折れ線化.
        /// </summary>
        [FvPluginExecute]
        public void Vectorize2dDP()
        {
            // 0) 点群の準備.
            FVIL.Data.CFviImage src1 = new FVIL.Data.CFviImage();
            FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/CG_Vectorize2d_src.bmp", src1, FVIL.PixelMode.Unpacking);

            FVIL.Edge.CFviEdgeResultI32 result1 = new FVIL.Edge.CFviEdgeResultI32();

            FVIL.Edge.CFviEdge2DSobelParam param = new FVIL.Edge.CFviEdge2DSobelParam();
            param.EdgeThreshold = 120;
            param.NmsLength = 1;

            GetEdgePoints(src1, param, result1);

            FVIL.PNT_T_ARRAY points = result1.ToPNT_T_ARRAY();


            // 1) インスタンスの準備.
            FVIL.CG.CFviVectorize2dDP parser = new FVIL.CG.CFviVectorize2dDP();


            // 2) 処理実行.
            parser.Execute(points, 3.0);

            // E) 確認.
            string outputFile = Defs.ResultDir + "/CG.Vectorize2dDP.png";
            Console.Out.WriteLine("-- Vectorize2dDP:{0}", outputFile);

            FVIL.GDI.CFviGdiPoints gdipoints = new FVIL.GDI.CFviGdiPoints(parser.Points);
            {
                FVIL.Data.CFviImage image = new FVIL.Data.CFviImage();

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

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

                // GDI オブジェクトの追加.
                pOverlay0.Figures.Add(gdipoints);

                // 保存.
                FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage();
                display.SaveImage(canvas, display.DisplayRect, 1.0);
                FVIL.File.Function.SaveImageFile(outputFile, canvas);
            }
        }
    }
}


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

Namespace SampleCode
    Public Partial Class CG
        ''' <summary>
        ''' DP法による点列の折れ線化.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub Vectorize2dDP()
            ' 0) 点群の準備.
            Dim src1 As New FVIL.Data.CFviImage()
            FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/CG_Vectorize2d_src.bmp", src1, FVIL.PixelMode.Unpacking)

            Dim result1 As New FVIL.Edge.CFviEdgeResultI32()

            Dim param As New FVIL.Edge.CFviEdge2DSobelParam()
            param.EdgeThreshold = 120
            param.NmsLength = 1

            GetEdgePoints(src1, param, result1)

            Dim points As FVIL.PNT_T_ARRAY = result1.ToPNT_T_ARRAY()


            ' 1) インスタンスの準備.
            Dim parser As New FVIL.CG.CFviVectorize2dDP()


            ' 2) 処理実行.
            parser.Execute(points, 3.0)

            ' E) 確認.
            Dim outputFile As String = Defs.ResultDir & "/CG.Vectorize2dDP.png"
            Console.Out.WriteLine("-- Vectorize2dDP:{0}", outputFile)

            Dim gdipoints As New FVIL.GDI.CFviGdiPoints(parser.Points)
            If True Then
                Dim image As New FVIL.Data.CFviImage()

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

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

                ' GDI オブジェクトの追加.
                pOverlay0.Figures.Add(gdipoints)

                ' 保存.
                Dim canvas As New FVIL.Data.CFviImage()
                display.SaveImage(canvas, display.DisplayRect, 1.0)
                FVIL.File.[Function].SaveImageFile(outputFile, canvas)
            End If
        End Sub
    End Class
End Namespace
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace User.SampleCode
{
    public partial class CG
    {
        /// <summary>
        /// 2次元エッジ検出による点群の取得.
        /// </summary>
        private void GetEdgePoints(FVIL.Data.CFviImage src,
                                    FVIL.Data.CFviDataObject param, FVIL.Edge.CFviEdgeResultI32 result)
        {
            // 1) インスタンスの準備.
            FVIL.Edge.CFviEdge2D parser = new FVIL.Edge.CFviEdge2D();
            FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage();

            // 2) 処理対象画像の有効性検査.
            int valid = FVIL.Edge.CFviEdge2D.CheckValidity(src);
            if (valid != FVIL.ErrorCode._SUCCESS)
                throw new FVIL.CFviException(valid, "FVIL.Edge.CFviEdge2D.CheckValidity");

            // 3) 画像処理準備 (共通)
            parser.SrcImages[0] = src;
            parser.DstImages[0] = dst;
            if (!parser.IsValid())    // 有効性検査.
                parser.Validate();    // 有効化.
            parser.Result = result;

            // 4-1) パラメータ設定 (継承)
            parser.BorderMode = FVIL.BorderMode.None;
            parser.MagMode = FVIL.Edge.MagMode.XY;
            parser.SaveMode = FVIL.Edge.SaveMode.Mag | FVIL.Edge.SaveMode.Direct;

            // 4-2) パラメータ設定 (固有)
            parser.Param = param;

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


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

Namespace SampleCode
    Public Partial Class CG
        ''' <summary>
        ''' 2次元エッジ検出による点群の取得.
        ''' </summary>
        Private Sub GetEdgePoints(src As FVIL.Data.CFviImage, param As FVIL.Data.CFviDataObject, result As FVIL.Edge.CFviEdgeResultI32)
            ' 1) インスタンスの準備.
            Dim parser As New FVIL.Edge.CFviEdge2D()
            Dim dst As New FVIL.Data.CFviImage()

            ' 2) 処理対象画像の有効性検査.
            Dim valid As Integer = FVIL.Edge.CFviEdge2D.CheckValidity(src)
            If valid <> FVIL.ErrorCode._SUCCESS Then
                Throw New FVIL.CFviException(valid, "FVIL.Edge.CFviEdge2D.CheckValidity")
            End If

            ' 3) 画像処理準備 (共通)
            parser.SrcImages(0) = src
            parser.DstImages(0) = dst
            If Not parser.IsValid() Then
                ' 有効性検査.
                parser.Validate()
            End If
            ' 有効化.
            parser.Result = result

            ' 4-1) パラメータ設定 (継承)
            parser.BorderMode = FVIL.BorderMode.None
            parser.MagMode = FVIL.Edge.MagMode.XY
            parser.SaveMode = FVIL.Edge.SaveMode.Mag Or FVIL.Edge.SaveMode.Direct

            ' 4-2) パラメータ設定 (固有)
            parser.Param = param

            ' 5) 画像処理実行.
            parser.Execute()
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL.CG..::..CFviVectorize2dDP

See Also