画像絶対値演算クラス
Namespace: FVIL.OperationAssembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)
Syntax
C# |
---|
[SerializableAttribute] public class CFviAbsOperation : CFviOperation |
Visual Basic |
---|
<SerializableAttribute> Public Class CFviAbsOperation Inherits CFviOperation |
Remarks
マルチコア対応:
要求する入出力画像数:
処理対象画像の条件:
下記の画像種別の場合は、入力画像の濃度値が必ず正である為、 実行結果は Copy(CFviImage, UInt32) 関数を使用した場合と同じになります。
このクラスの Execute()()()() メソッドは、 SetParallelNum(Int32) によって設定されたスレッド数に従って、 自動的に処理を並列化します。 マルチコア環境においては、処理を並列化する事によりレーテンシを短縮できる場合があります。 詳しくは、 SetParallelNum(Int32) の説明をご参照ください。
画像データの絶対値演算を行うクラスです。
各画素の濃度値の絶対値を求め、出力画像に出力します。
式は次のようになります。
出力画像 = |入力画像|
要求する入出力画像数:
項目 | 数 | 定数 |
---|---|---|
入力画像 | 1 | SrcImageCount フィールド |
出力画像 | 1 | DstImageCount フィールド |
処理対象画像の条件:
処理対象の画像は下記の条件を満たしている必要が有ります。
- 入力画像と出力画像の型、及びチャネル数が等しい事
- 入力画像と出力画像の処理範囲の幅と高さがと等しい事
- 処理対象の画像種別
下記の画像種別の場合は、入力画像の濃度値が必ず正である為、 実行結果は Copy(CFviImage, UInt32) 関数を使用した場合と同じになります。
※) 本機能はインプレース処理が可能です。入出力に同一の画像オブジェクトを指定することができます。
Examples
差分処理が行われた画像の絶対値を求める処理です。
下図右側は、画素値の符号を視覚的に確認する為に、 正の値をグレーで表示し、負の値をマゼンタで表示しています。
ソースコード:
テスト画像の作成:
上記で使用するテスト画像を作成するコードです。
下図右側は、画素値の符号を視覚的に確認する為に、 正の値をグレーで表示し、負の値をマゼンタで表示しています。
src | dst | ||
ソースコード:
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 Operation { // ============================================================ /// <summary> /// 画像絶対値演算クラス. /// </summary> [FvPluginExecute] public void AbsOperation() { // 1) インスタンスの準備. FVIL.Operation.CFviAbsOperation parser = new FVIL.Operation.CFviAbsOperation(); FVIL.Data.CFviImage src = null; FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage(); // 2) 処理対象画像の取り込み. src = make_image_s16(); // 3) 処理対象画像の有効性検査. int valid = FVIL.Operation.CFviAbsOperation.CheckValidity(src); if (valid != FVIL.ErrorCode._SUCCESS) throw new FVIL.CFviException(valid, "FVIL.Operation.CFviAbsOperation.CheckValidity"); // 4) 画像処理準備 (共通) parser.SrcImages[0] = src; parser.DstImages[0] = dst; if (!parser.IsValid()) // 有効性検査. parser.Validate(); // 有効化. // 5) パラメータ設定 (固有) // 6) 画像処理実行. parser.Execute(); // E) 処理結果画像の保存. // --- 画素値の可視化 (S16 -> RGB32) // −:magenta / +: gray FVIL.Data.CFviImage temp0 = new FVIL.Data.CFviImage(src.HorzSize, src.VertSize, FVIL.ImageType.RGB32, 1); src.Depth = src.CalcDepth(); src.SignedToRGB(0, temp0, 1); FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/Operation.AbsOperation-src.png", temp0); // --- 画素値のコピー (S16 -> UC8) FVIL.Data.CFviImage temp1 = new FVIL.Data.CFviImage(dst.HorzSize, dst.VertSize, FVIL.ImageType.UC8, 1); temp1.Copy( dst, 1 ); FVIL.File.Function.SaveImageFile(Defs.ResultDir + "/Operation.AbsOperation-dst.png", temp1); } } } |
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 Operation ' ============================================================ ''' <summary> ''' 画像絶対値演算クラス. ''' </summary> <FvPluginExecute> _ Public Sub AbsOperation() ' 1) インスタンスの準備. Dim parser As New FVIL.Operation.CFviAbsOperation() Dim src As FVIL.Data.CFviImage = Nothing Dim dst As New FVIL.Data.CFviImage() ' 2) 処理対象画像の取り込み. src = make_image_s16() ' 3) 処理対象画像の有効性検査. Dim valid As Integer = FVIL.Operation.CFviAbsOperation.CheckValidity(src) If valid <> FVIL.ErrorCode._SUCCESS Then Throw New FVIL.CFviException(valid, "FVIL.Operation.CFviAbsOperation.CheckValidity") End If ' 4) 画像処理準備 (共通) parser.SrcImages(0) = src parser.DstImages(0) = dst If Not parser.IsValid() Then ' 有効性検査. parser.Validate() End If ' 有効化. ' 5) パラメータ設定 (固有) ' 6) 画像処理実行. parser.Execute() ' E) 処理結果画像の保存. ' --- 画素値の可視化 (S16 -> RGB32) ' −:magenta / +: gray Dim temp0 As New FVIL.Data.CFviImage(src.HorzSize, src.VertSize, FVIL.ImageType.RGB32, 1) src.Depth = src.CalcDepth() src.SignedToRGB(0, temp0, 1) FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/Operation.AbsOperation-src.png", temp0) ' --- 画素値のコピー (S16 -> UC8) Dim temp1 As New FVIL.Data.CFviImage(dst.HorzSize, dst.VertSize, FVIL.ImageType.UC8, 1) temp1.Copy(dst, 1) FVIL.File.[Function].SaveImageFile(Defs.ResultDir & "/Operation.AbsOperation-dst.png", temp1) End Sub End Class End Namespace |
テスト画像の作成:
上記で使用するテスト画像を作成するコードです。
C# | Copy |
---|---|
// $Revision: 1.2 $ using System; using System.Collections.Generic; using System.Text; using System.Drawing; namespace User.SampleCode { public partial class Operation { // ============================================================ /// <summary> /// 画像絶対値演算クラスのテスト画像. /// </summary> internal FVIL.Data.CFviImage make_image_s16() { // 1) ワーク画像の取り込み. FVIL.Data.CFviImage work0 = new FVIL.Data.CFviImage(); FVIL.Data.CFviImage work1 = new FVIL.Data.CFviImage(); FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/logic_UC8_3.png", work0, FVIL.PixelMode.Unpacking); FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/logic_UC8_1.png", work1, FVIL.PixelMode.Unpacking); int horz = work0.HorzSize; int vert = work0.VertSize; // 2) インスタンスの準備. FVIL.Data.CFviImage src1 = new FVIL.Data.CFviImage(horz, vert, FVIL.ImageType.S16, 1); FVIL.Data.CFviImage src2 = new FVIL.Data.CFviImage(horz, vert, FVIL.ImageType.S16, 1); // 3) 画素値のコピー (UC8 -> S16) for (int y = 0; y < vert; y++) { for (int x = 0; x < horz; x++) { src1.SetPixel(x, y, work0.GetPixel(x, y)); src2.SetPixel(x, y, work1.GetPixel(x, y)); } } // 4) 減算. FVIL.Operation.CFviSubOperation parser = new FVIL.Operation.CFviSubOperation(); parser.SrcImages[0] = src1; parser.SrcImages[1] = src2; parser.DstImages[0] = new FVIL.Data.CFviImage(); parser.Validate(); parser.Execute(); return parser.DstImages[0]; } } } |
Visual Basic | Copy |
---|---|
' $Revision: 1.1 $ Imports System.Collections.Generic Imports System.Text Imports System.Drawing Namespace SampleCode Public Partial Class Operation ' ============================================================ ''' <summary> ''' 画像絶対値演算クラスのテスト画像. ''' </summary> Friend Function make_image_s16() As FVIL.Data.CFviImage ' 1) ワーク画像の取り込み. Dim work0 As New FVIL.Data.CFviImage() Dim work1 As New FVIL.Data.CFviImage() FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/logic_UC8_3.png", work0, FVIL.PixelMode.Unpacking) FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/logic_UC8_1.png", work1, FVIL.PixelMode.Unpacking) Dim horz As Integer = work0.HorzSize Dim vert As Integer = work0.VertSize ' 2) インスタンスの準備. Dim src1 As New FVIL.Data.CFviImage(horz, vert, FVIL.ImageType.S16, 1) Dim src2 As New FVIL.Data.CFviImage(horz, vert, FVIL.ImageType.S16, 1) ' 3) 画素値のコピー (UC8 -> S16) For y As Integer = 0 To vert - 1 For x As Integer = 0 To horz - 1 src1.SetPixel(x, y, work0.GetPixel(x, y)) src2.SetPixel(x, y, work1.GetPixel(x, y)) Next Next ' 4) 減算. Dim parser As New FVIL.Operation.CFviSubOperation() parser.SrcImages(0) = src1 parser.SrcImages(1) = src2 parser.DstImages(0) = New FVIL.Data.CFviImage() parser.Validate() parser.Execute() Return parser.DstImages(0) End Function End Class End Namespace |
Inheritance Hierarchy
System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.Operation..::..CFviOperation
FVIL.Operation..::..CFviAbsOperation
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.Operation..::..CFviOperation
FVIL.Operation..::..CFviAbsOperation