2次元エッジ検出クラス(相関エッジ法)
Namespace: FVIL.EdgeAssembly: 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
相関エッジ法によって、エッジの勾配方向および強度を含むエッジ検出を行うクラスです。
要求する入出力画像数:
項目 | 数 | 定数 |
---|---|---|
入力画像 | 1 | SrcImageCount フィールド |
出力画像 | 1 | DstImageCount フィールド |
処理対象画像の条件:
処理対象の画像は下記の条件を満たしている必要が有ります。
- 入力画像の画像種別が以下のいずれかで、チャネル数が 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 | 特徴量 | - |
初期値と範囲:
プロパティ | 初期値 | 範囲 |
---|---|---|
Param | CFviEdge2DCorrelationParamの初期値 | ※インスタンスの差し替えはできません。 |
BorderMode | BorderMode.None | BorderModeの定数 |
MagMode | MagMode.XY | MagModeの定数 |
SaveMode | SaveMode.None | SaveModeの定数の論理和 |
Examples
【エッジ点】
【エッジ強度】
ソースコード:
C# | Copy |
---|---|
// $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 |
---|---|
' $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
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.Edge..::..CFviEdge
FVIL.Edge..::..CFviEdge2DCorrelation