2次元エッジ検出クラス(相関エッジ法)

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

Syntax

C#
[SerializableAttribute]
public class CFviEdge2DCorrelation : CFviEdge
Visual Basic
<SerializableAttribute>
Public Class CFviEdge2DCorrelation
	Inherits CFviEdge

Remarks

相関エッジ法によって、エッジの勾配方向および強度を含むエッジ検出を行うクラスです。


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

処理対象画像の条件:

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

  • 入力画像の画像種別が以下のいずれかで、チャネル数が 1 であること
  • 出力画像の画像種別が FVIL.ImageType.US16、チャネル数が 1 であること
  • 入力画像と出力画像の処理範囲のサイズが一致していること

※ 出力画像は、エッジ強度を画像に保存する場合に使用します。 SaveMode が Mag または All のときは必須です。 それ以外の場合は省略できます。
エッジ勾配方向と強度の保持:

計測結果として、エッジ方向勾配方向やエッジ強度も取得するかどうかは、SaveMode の設定により決定します。

エッジ強度を取得する場合には、SaveMode の設定が必要です。 出力画像はエッジ強度画像となりますが、必要でない場合 null を指定することが可能です。 SaveMode の設定で、エッジ強度を取得する設定となっており、出力画像に null が指定されていた場合、 エッジ強度画像は生成されず、 Result にのみ結果が格納されます。

SaveMode でエッジ強度を取得しない設定をした場合は、出力画像には null を設定する必要があります。 この場合に出力画像を設定すると、実行時(Execute()()()())に、FVCL.ErrorCode.INVALID_PARAMETER を通知します。


エッジ強度について:

エッジ強度は、0.0〜1.0 の間の値で返され、エッジが強いほど 1.0 に近くなります。
エッジ強度画像は、 最大値が US16 の MAX(65535) となるように正規化されています。


検出結果:

検出結果は Result に格納されます。 検出結果から単一のエッジデータ (CFviEdgeData) を取得するには、 GetData(Int32) を使用してください。

検出プロパティ内容範囲
Positionエッジ位置座標(画像座標)
Valueエッジ強度0.0~1.0
×Directionエッジ極性方向-
Angleエッジの勾配-180~180 (度)
×Feature特徴量-

初期値と範囲:

プロパティ初期値範囲
ParamCFviEdge2DCorrelationParamの初期値※インスタンスの差し替えはできません。
BorderModeBorderMode.NoneBorderModeの定数
MagModeMagMode.XYMagModeの定数
SaveModeSaveMode.NoneSaveModeの定数の論理和

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 Edge2D
    {
        // ============================================================
        /// <summary>
        /// 相関エッジ.
        /// </summary>
        [FvPluginExecute]
        public void CorrelationEdge()
        {
            // 1) インスタンスの準備.
            FVIL.Edge.CFviEdge2DCorrelation parser = new FVIL.Edge.CFviEdge2DCorrelation();
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage();
            FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage();

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

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

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

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

            // 5-2) パラメータ設定 (固有)
            parser.Param.RegionWidth = 13;
            parser.Param.RegionHeight = 5;
            parser.Param.SigmoidK = 1.0;
            parser.Param.VarThreshold = 20.0;
            parser.Param.EdgeThreshold = 40;
            parser.Param.NmsLength = 6;

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

            // E) 処理結果画像の保存.
            FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/Edge2D.Edge2DCorrelation-mag.png", dst);

            // E) 処理結果画像の表示.
            {
                FVIL.GDI.CFviDisplay display = new FVIL.GDI.CFviDisplay();
                display.Image = src;
                display.DisplayRect = src.Window;
                display.Magnification = 8.0;
                display.HalftoneMode = true;

                display.Overlays.Add(new FVIL.GDI.CFviOverlay());
                display.Overlays.Add(new FVIL.GDI.CFviOverlay());
                FVIL.GDI.CFviOverlay overlay0 = display.Overlays[0];
                FVIL.GDI.CFviOverlay overlay1 = display.Overlays[1];
                overlay0.Scaling = true;
                overlay1.Scaling = false;

                for (int i = 0; i < parser.Result.Count; i++)
                {
                    FVIL.Edge.CFviEdgeData edge = parser.Result[i];

                    // エッジ強度を輝度値に変換.
                    int value = (int)(edge.Value * 128);
                    if (value > 127)
                        value = 127;

                    // エッジ位置に > マークを表示 (0度が左向き)
                    FVIL.GDI.CFviGdiPoint position = new FVIL.GDI.CFviGdiPoint(edge.Position);
                    position.Size = new System.Drawing.Size(3, 1);
                    position.Style = FVIL.GDI.FigureStyle.Arrow;
                    position.Angle = edge.Angle;
                    position.Pen.Color = System.Drawing.Color.FromArgb(0,128+value,0);
                    overlay0.Figures.Add(position);

                    // 画像座標をスクリーン座標に変換.
                    System.Drawing.Point dp = display.IPtoDP(position.ToCFviPoint(), FVIL.GDI.ScalingMode.Center);

                    // 強度と角度の文字表示.
                    FVIL.GDI.CFviGdiString text = new FVIL.GDI.CFviGdiString();
                    text.Text = System.String.Format("{0:F} ({1:F})", edge.Value, edge.Angle.Degree);
                    text.Font.Size = new System.Drawing.Size(6, 10);
                    text.Align = FVIL.GDI.TextAlign.Right | FVIL.GDI.TextAlign.Bottom;
                    text.Position = new FVIL.Data.CFviPoint(dp.X - 24, dp.Y + 5);
                    text.Color = System.Drawing.Color.FromArgb(128 + value, 0, 0);
                    text.Angle = edge.Angle;
                    text.Axis = new FVIL.Data.CFviPoint(24, -5);
                    overlay1.Figures.Add(text);
                }

                FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage();

                // x1 画像.
                overlay0.Enable = true;        // 可視.
                overlay1.Enable = false;    // 非可視.
                display.SaveImage(canvas, display.DisplayRect, 1.0);
                FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/Edge2D.Edge2DCorrelation-x1.png", canvas);

                // x8 画像.
                overlay0.Enable = true;        // 可視.
                overlay1.Enable = true;        // 可視.
                display.SaveImage(canvas, display.DisplayRect, 8.0);
                FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/Edge2D.Edge2DCorrelation-x8.png", canvas);
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli
' FvPluginXXXX attribute requires fvalgcli
Namespace SampleCode
    Public Partial Class Edge2D
        ' ============================================================
        ''' <summary>
        ''' 相関エッジ.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub CorrelationEdge()
            ' 1) インスタンスの準備.
            Dim parser As New FVIL.Edge.CFviEdge2DCorrelation()
            Dim src As New FVIL.Data.CFviImage()
            Dim dst As New FVIL.Data.CFviImage()

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

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

            ' 4) 画像処理準備 (共通)
            parser.SrcImages(0) = src
            parser.DstImages(0) = dst
            If Not parser.IsValid() Then
                ' 有効性検査.
                parser.Validate()
            End If
            ' 有効化.
            ' 5-1) パラメータ設定 (継承)
            parser.BorderMode = FVIL.BorderMode.None
            parser.MagMode = FVIL.Edge.MagMode.XY
            parser.SaveMode = FVIL.Edge.SaveMode.Mag Or FVIL.Edge.SaveMode.Direct

            ' 5-2) パラメータ設定 (固有)
            parser.Param.RegionWidth = 13
            parser.Param.RegionHeight = 5
            parser.Param.SigmoidK = 1.0
            parser.Param.VarThreshold = 20.0
            parser.Param.EdgeThreshold = 40
            parser.Param.NmsLength = 6

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

            ' E) 処理結果画像の保存.
            FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/Edge2D.Edge2DCorrelation-mag.png", dst)

            ' E) 処理結果画像の表示.
            If True Then
                Dim display As New FVIL.GDI.CFviDisplay()
                display.Image = src
                display.DisplayRect = src.Window
                display.Magnification = 8.0
                display.HalftoneMode = True

                display.Overlays.Add(New FVIL.GDI.CFviOverlay())
                display.Overlays.Add(New FVIL.GDI.CFviOverlay())
                Dim overlay0 As FVIL.GDI.CFviOverlay = display.Overlays(0)
                Dim overlay1 As FVIL.GDI.CFviOverlay = display.Overlays(1)
                overlay0.Scaling = True
                overlay1.Scaling = False

                For i As Integer = 0 To parser.Result.Count - 1
                    Dim edge As FVIL.Edge.CFviEdgeData = parser.Result(i)

                    ' エッジ強度を輝度値に変換.
                    Dim value As Integer = CInt(Math.Truncate(edge.Value * 128))
                    If value > 127 Then
                        value = 127
                    End If

                    ' エッジ位置に > マークを表示 (0度が左向き)
                    Dim position As New FVIL.GDI.CFviGdiPoint(edge.Position)
                    position.Size = New System.Drawing.Size(3, 1)
                    position.Style = FVIL.GDI.FigureStyle.Arrow
                    position.Angle = edge.Angle
                    position.Pen.Color = System.Drawing.Color.FromArgb(0, 128 + value, 0)
                    overlay0.Figures.Add(position)

                    ' 画像座標をスクリーン座標に変換.
                    Dim dp As System.Drawing.Point = display.IPtoDP(position.ToCFviPoint(), FVIL.GDI.ScalingMode.Center)

                    ' 強度と角度の文字表示.
                    Dim text As New FVIL.GDI.CFviGdiString()
                    text.Text = System.[String].Format("{0:F} ({1:F})", edge.Value, edge.Angle.Degree)
                    text.Font.Size = New System.Drawing.Size(6, 10)
                    text.Align = FVIL.GDI.TextAlign.Right Or FVIL.GDI.TextAlign.Bottom
                    text.Position = New FVIL.Data.CFviPoint(dp.X - 24, dp.Y + 5)
                    text.Color = System.Drawing.Color.FromArgb(128 + value, 0, 0)
                    text.Angle = edge.Angle
                    text.Axis = New FVIL.Data.CFviPoint(24, -5)
                    overlay1.Figures.Add(text)
                Next

                Dim canvas As New FVIL.Data.CFviImage()

                ' x1 画像.
                overlay0.Enable = True
                ' 可視.
                overlay1.Enable = False
                ' 非可視.
                display.SaveImage(canvas, display.DisplayRect, 1.0)
                FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/Edge2D.Edge2DCorrelation-x1.png", canvas)

                ' x8 画像.
                overlay0.Enable = True
                ' 可視.
                overlay1.Enable = True
                ' 可視.
                display.SaveImage(canvas, display.DisplayRect, 8.0)
                FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/Edge2D.Edge2DCorrelation-x8.png", canvas)
            End If
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.Edge..::..CFviEdge
FVIL.Edge..::..CFviEdge2DCorrelation

See Also