極座標変換クラス

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

Syntax

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

Remarks

画像の極座標変換(または逆変換)を行うクラスです。


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

処理対象画像の条件:

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

  • 入力画像と出力画像の画像種別、チャネル数が一致している事 -
  • 画像種別(ImageType)が以下の何れかに該当する事 -
※入力画像と出力画像の画像サイズや処理範囲サイズは一致している必要はありません。


処理対象画像の有効性検査と有効化:

入力画像の有効性検査 このクラスの CheckValidity(CFviImage) 関数で入力画像の有効性を検査できます。 この関数はスタティックメンバですので、このクラスのインスタンスを生成せずに直接呼び出す事ができます。
入出力画像の整合性検査 このクラスの IsValid()()()() メソッドで入出力画像の整合性を検査できます。 このメソッドが false を返す場合は、前述の処理対象画像の条件を満たしていない為、 実行できない事を意味します。
出力画像の有効化 このクラスの Validate(Int32) メソッドで出力画像を有効化する事ができます。 このメソッドを実行すると、出力画像の領域サイズ、画像種別、チャネル数を適切なものに設定します。 領域サイズは、このメソッドの引数によって以下のように調整できます。
  • Validate(0) : 入力画像の処理範囲サイズに応じて、出力画像の画像領域を調整します。
  • Validate(1) : 極座標変換パラメータに応じて、出力画像の画像領域を調整します。


初期値と範囲:
プロパティ初期値範囲
ClearBackModetruetrue/false
Invertfalsetrue/false
SamplingModeNearestNeighborSamplingMode に定義された定数
ParamCFviPolarTransParam の初期値※インスタンスの差し替えはできません。

Examples


サンプルコード (極座標変換):

極座標変換の処理例:
回転するCD−ROMをラインセンサで撮像した画像(下図【入力画像】)を極座標変換して、 元の円形の状態(下図【出力画像】)に復元する処理例を示します。

【入力画像】


【出力画像】


ソースコード:

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 PolarTrans
    {
        // ============================================================
        /// <summary>
        /// 極座標変換クラス.
        /// </summary>
        [FvPluginExecute]
        public void PolarTransClass()
        {
            // 1) インスタンスの準備.
            FVIL.PolarTrans.CFviPolarTrans parser = new FVIL.PolarTrans.CFviPolarTrans();
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage();
            FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage();

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

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

            // 4) 画像処理準備 (共通)
            parser.SrcImages[0] = src;
            parser.DstImages[0] = dst;

            // 5) パラメータ設定.
            parser.Invert = false;            // false: 矩形→円形.
            parser.ClearBackMode = true;
            parser.SamplingMode = FVIL.PolarTrans.SamplingMode.Bilinear;
            parser.Param.CoordinateMode = FVIL.PolarTrans.CoordinateMode.Left;

            FVIL.PolarTrans.CFviPolarTransParam param = parser.Param;
            param.CoordinateMode = FVIL.PolarTrans.CoordinateMode.Left;
            param.OriginIn = new FVIL.Data.CFviPoint(src.Window.X,src.Window.Y);
            param.Width = src.Window.Width;
            param.Height = src.Window.Height;
            param.OriginOut = new FVIL.Data.CFviPoint(param.Width,param.Width);
            param.Radius = param.Width;
            param.StartAngle = new FVIL.Data.CFviAngle(270.0);
            param.RangeAngle = new FVIL.Data.CFviAngle(360.0);

            // 5-2) 出力画像の有効化.
            parser.Validate(1);    // 有効化.

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

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


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 PolarTrans
        ' ============================================================
        ''' <summary>
        ''' 極座標変換クラス.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub PolarTransClass()
            ' 1) インスタンスの準備.
            Dim parser As New FVIL.PolarTrans.CFviPolarTrans()
            Dim src As New FVIL.Data.CFviImage()
            Dim dst As New FVIL.Data.CFviImage()

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

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

            ' 4) 画像処理準備 (共通)
            parser.SrcImages(0) = src
            parser.DstImages(0) = dst

            ' 5) パラメータ設定.
            parser.Invert = False
            ' false: 矩形→円形.
            parser.ClearBackMode = True
            parser.SamplingMode = FVIL.PolarTrans.SamplingMode.Bilinear
            parser.Param.CoordinateMode = FVIL.PolarTrans.CoordinateMode.Left

            Dim param As FVIL.PolarTrans.CFviPolarTransParam = parser.Param
            param.CoordinateMode = FVIL.PolarTrans.CoordinateMode.Left
            param.OriginIn = New FVIL.Data.CFviPoint(src.Window.X, src.Window.Y)
            param.Width = src.Window.Width
            param.Height = src.Window.Height
            param.OriginOut = New FVIL.Data.CFviPoint(param.Width, param.Width)
            param.Radius = param.Width
            param.StartAngle = New FVIL.Data.CFviAngle(270.0)
            param.RangeAngle = New FVIL.Data.CFviAngle(360.0)

            ' 5-2) 出力画像の有効化.
            parser.Validate(1)
            ' 有効化.
            ' 6) 画像処理実行.
            parser.Execute()

            ' E) 処処理結果画像の保存.
            FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/PolarTrans.PolarTrans.png", dst)
        End Sub
    End Class
End Namespace

[↑戻る]


サンプルコード (逆変換):

逆変換の処理例:
CD−ROMの中心に円形状に刻印された文字を直線状に変換する処理例を示します。
変換を行う前に処理対象(円形)の中心位置を取得する必要があります。 ここでは、
円ハフ検出 を用いています。
極座標変換の逆変換処理については、ソースコード(1) をご参照ください。 円ハフ検出による中心位置の取得処理については、ソースコード(2)をご参照ください。

【入力画像】


【中心位置】


【出力画像】


ソースコード(1): 円形から矩形への逆変換

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 PolarTrans
    {
        // ============================================================
        /// <summary>
        /// 極座標変換クラス.
        /// </summary>
        [FvPluginExecute]
        public void PolarTransInvert()
        {
            // 1) インスタンスの準備.
            FVIL.PolarTrans.CFviPolarTrans parser = new FVIL.PolarTrans.CFviPolarTrans();
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage();
            FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage();

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

            // 3) 処理対象画像の有効性検査.
            if( FVIL.ErrorCode._SUCCESS != FVIL.PolarTrans.CFviPolarTrans.CheckValidity( src ) )
                return;

            // 4) 画像処理準備.
            parser.SrcImages[0] = src;
            parser.DstImages[0] = dst;

            // 5-1) パラメータ設定.
            parser.Invert = true;            // true: 円形→矩形.
            parser.ClearBackMode = true;
            parser.SamplingMode = FVIL.PolarTrans.SamplingMode.NearestNeighbor;

            // --- 円形領域の中心位置の取得.
            double target = 91/2.0;        // 目標の円半径 (画像によって調整が必要)
            double tie = 24;            // 目標の円の帯幅 (画像によって調整が必要)
            FVIL.Data.CFviPoint    center = new FVIL.Data.CFviPoint();    // 検出した円中心.
            double radius;                // 変換する円半径.
            try
            {
                center = get_center( src, target-(tie/4.0), target+(tie/4.0) );
                radius = (center.X<center.Y) ? center.X : center.Y;
            }
            catch( FVIL.CFviException ex )
            {
                throw new FVIL.CFviException(ex.ErrorCode, "get_center", "Failed to get a center point of circle.");
            }

            // --- パラメータ構造クラス.
            FVIL.PolarTrans.CFviPolarTransParam param = parser.Param;
            param.CoordinateMode = FVIL.PolarTrans.CoordinateMode.Lower;
            // --- 入力: 円形領域の設定.
            param.OriginOut = center;
            param.Radius = radius;
            param.StartAngle = new FVIL.Data.CFviAngle(235.0);    // (!) 画像によって調整が必要.
            param.RangeAngle = new FVIL.Data.CFviAngle(360.0);
            // --- 出力: 矩形領域の設定.
            param.OriginIn = new FVIL.Data.CFviPoint(0,radius-1);
            param.Width = 2 * FVIL.Math.Pi * (target+(tie/2.0));    // 目標の円の円周よりやや外側.
            param.Height = radius;

            // 5-2) 出力画像の有効化.
            parser.Validate(1);        // 有効化.

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

            // E) 処理結果画像の保存.
            FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/PolarTrans.PolarTransInvert.png", dst);
        }
    }
}


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 PolarTrans
        ' ============================================================
        ''' <summary>
        ''' 極座標変換クラス.
        ''' </summary>
        <FvPluginExecute> _
        Public Sub PolarTransInvert()
            ' 1) インスタンスの準備.
            Dim parser As New FVIL.PolarTrans.CFviPolarTrans()
            Dim src As New FVIL.Data.CFviImage()
            Dim dst As New FVIL.Data.CFviImage()

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

            ' 3) 処理対象画像の有効性検査.
            If FVIL.ErrorCode._SUCCESS <> FVIL.PolarTrans.CFviPolarTrans.CheckValidity(src) Then
                Return
            End If

            ' 4) 画像処理準備.
            parser.SrcImages(0) = src
            parser.DstImages(0) = dst

            ' 5-1) パラメータ設定.
            parser.Invert = True
            ' true: 円形→矩形.
            parser.ClearBackMode = True
            parser.SamplingMode = FVIL.PolarTrans.SamplingMode.NearestNeighbor

            ' --- 円形領域の中心位置の取得.
            Dim target As Double = 91 / 2.0
            ' 目標の円半径 (画像によって調整が必要)
            Dim tie As Double = 24
            ' 目標の円の帯幅 (画像によって調整が必要)
            Dim center As New FVIL.Data.CFviPoint()
            ' 検出した円中心.
            Dim radius As Double
            ' 変換する円半径.
            Try
                center = get_center(src, target - (tie / 4.0), target + (tie / 4.0))
                radius = If((center.X < center.Y), center.X, center.Y)
            Catch ex As FVIL.CFviException
                Throw New FVIL.CFviException(ex.ErrorCode, "get_center", "Failed to get a center point of circle.")
            End Try

            ' --- パラメータ構造クラス.
            Dim param As FVIL.PolarTrans.CFviPolarTransParam = parser.Param
            param.CoordinateMode = FVIL.PolarTrans.CoordinateMode.Lower
            ' --- 入力: 円形領域の設定.
            param.OriginOut = center
            param.Radius = radius
            param.StartAngle = New FVIL.Data.CFviAngle(235.0)
            ' (!) 画像によって調整が必要.
            param.RangeAngle = New FVIL.Data.CFviAngle(360.0)
            ' --- 出力: 矩形領域の設定.
            param.OriginIn = New FVIL.Data.CFviPoint(0, radius - 1)
            param.Width = 2 * FVIL.Math.Pi * (target + (tie / 2.0))
            ' 目標の円の円周よりやや外側.
            param.Height = radius

            ' 5-2) 出力画像の有効化.
            parser.Validate(1)
            ' 有効化.
            ' 6) 画像処理実行.
            parser.Execute()

            ' E) 処理結果画像の保存.
            FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/PolarTrans.PolarTransInvert.png", dst)
        End Sub
    End Class
End Namespace

ソースコード(2): 円ハフ検出による中心位置の取得

C# Copy imageCopy
//    $Revision: 1.2 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace User.SampleCode
{
    public partial class PolarTrans
    {
        // ============================================================
        /// <summary>
        /// ディスクの中心座標の取得.
        /// </summary>
        internal FVIL.Data.CFviPoint get_center(FVIL.Data.CFviImage image, double radius_min, double radius_max)
        {
            FVIL.Data.CFviPoint    center = new FVIL.Data.CFviPoint(0,0);

            // -) 有効性の検査.
            int    valid = FVIL.Hough.CFviCircleHoughSobelEdge.CheckValidity(image);
            if( valid != FVIL.ErrorCode._SUCCESS )
                throw new FVIL.CFviException(valid,"FVIL.Hough.CFviCircleHoughSobelEdge.CheckValidity");

            // -) インスタンスの準備.
            FVIL.Hough.CFviCircleHoughSobelEdge parser = new FVIL.Hough.CFviCircleHoughSobelEdge();

            // -) 画像処理準備.
            parser.SrcImages[0] = image;

            // -) パラメータ設定 (本体)
            FVIL.Hough.CFviCircleHoughParam param = parser.Param;
            param.Resolution = 1.0;
            param.RadiusMin = radius_min;
            param.RadiusMax = radius_max;
            param.QRange = 30;
            param.EdgePercent = 20;
            param.MinScore = 8;
            param.ObjectColor = FVIL.Hough.ObjectColor.BlackOrWhite;
            param.MergeCenter = 2;
            param.MergeRadius = 1;

            // -) パラメータ設定 (エッジ検出部分)
            FVIL.Edge.CFviEdge2DSobelParam param_edge = parser.ParamEdge;
            param_edge.EdgeThreshold = 120;
            param_edge.NmsLength = 1;

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

            // -) スコア最大値の円を取得.
            FVIL.Data.CFviCircle max_circle = new FVIL.Data.CFviCircle();
            int max_score = 0;
            for(int i = 0; i < parser.Result.Count; i++ )
            {
                FVIL.Hough.CFviCircleHoughData data = parser.Result[i];
                if( max_score < data.Score )
                {
                    max_score = data.Score;
                    max_circle.Center = data.Center;
                    max_circle.Radius = data.Radius;
                }
            }
            center = max_circle.Center;

            // E) 確認用.
            {
                // 画像表示の準備.
                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;
                display.Overlays.Add(pOverlay0);

                // 描画図形の生成と追加.

                // --- 円データ生成.
                FVIL.GDI.CFviGdiCircle circle = new FVIL.GDI.CFviGdiCircle(max_circle);
                circle.Pen.Color = System.Drawing.Color.Red;

                FVIL.GDI.CFviGdiPoint point = new FVIL.GDI.CFviGdiPoint(circle.Center);
                point.Pen.Color = System.Drawing.Color.Red;
                point.Style = FVIL.GDI.FigureStyle.Cross;
                point.Size = new System.Drawing.Size( 10, 10 );

                // --- オーバレイへ追加.
                pOverlay0.Figures.Add( circle );
                pOverlay0.Figures.Add( point );

                // 画像保存.
                FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage();
                display.SaveImage( canvas, display.DisplayRect, 1.0 );
                FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/PolarTrans.get_center.png", canvas);
            }

            return center;
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing

Namespace SampleCode
    Public Partial Class PolarTrans
        ' ============================================================
        ''' <summary>
        ''' ディスクの中心座標の取得.
        ''' </summary>
        Friend Function get_center(image As FVIL.Data.CFviImage, radius_min As Double, radius_max As Double) As FVIL.Data.CFviPoint
            Dim center As New FVIL.Data.CFviPoint(0, 0)

            ' -) 有効性の検査.
            Dim valid As Integer = FVIL.Hough.CFviCircleHoughSobelEdge.CheckValidity(image)
            If valid <> FVIL.ErrorCode._SUCCESS Then
                Throw New FVIL.CFviException(valid, "FVIL.Hough.CFviCircleHoughSobelEdge.CheckValidity")
            End If

            ' -) インスタンスの準備.
            Dim parser As New FVIL.Hough.CFviCircleHoughSobelEdge()

            ' -) 画像処理準備.
            parser.SrcImages(0) = image

            ' -) パラメータ設定 (本体)
            Dim param As FVIL.Hough.CFviCircleHoughParam = parser.Param
            param.Resolution = 1.0
            param.RadiusMin = radius_min
            param.RadiusMax = radius_max
            param.QRange = 30
            param.EdgePercent = 20
            param.MinScore = 8
            param.ObjectColor = FVIL.Hough.ObjectColor.BlackOrWhite
            param.MergeCenter = 2
            param.MergeRadius = 1

            ' -) パラメータ設定 (エッジ検出部分)
            Dim param_edge As FVIL.Edge.CFviEdge2DSobelParam = parser.ParamEdge
            param_edge.EdgeThreshold = 120
            param_edge.NmsLength = 1

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

            ' -) スコア最大値の円を取得.
            Dim max_circle As New FVIL.Data.CFviCircle()
            Dim max_score As Integer = 0
            For i As Integer = 0 To parser.Result.Count - 1
                Dim data As FVIL.Hough.CFviCircleHoughData = parser.Result(i)
                If max_score < data.Score Then
                    max_score = data.Score
                    max_circle.Center = data.Center
                    max_circle.Radius = data.Radius
                End If
            Next
            center = max_circle.Center

            ' E) 確認用.
            If True Then
                ' 画像表示の準備.
                Dim display As New FVIL.GDI.CFviDisplay()
                display.Image = image
                display.DisplayRect = image.Window

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

                ' 描画図形の生成と追加.

                ' --- 円データ生成.
                Dim circle As New FVIL.GDI.CFviGdiCircle(max_circle)
                circle.Pen.Color = System.Drawing.Color.Red

                Dim point As New FVIL.GDI.CFviGdiPoint(circle.Center)
                point.Pen.Color = System.Drawing.Color.Red
                point.Style = FVIL.GDI.FigureStyle.Cross
                point.Size = New System.Drawing.Size(10, 10)

                ' --- オーバレイへ追加.
                pOverlay0.Figures.Add(circle)
                pOverlay0.Figures.Add(point)

                ' 画像保存.
                Dim canvas As New FVIL.Data.CFviImage()
                display.SaveImage(canvas, display.DisplayRect, 1.0)
                FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/PolarTrans.get_center.png", canvas)
            End If

            Return center
        End Function
    End Class
End Namespace

[↑戻る]

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.PolarTrans..::..CFviPolarTrans

See Also