コントラストの強調 - Part 3
概要
プログラムに直接コントラストの強調処理を埋め込む方法を示しています。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | contrast_enhancement3_cs_3.5.zip |
サンプルツールの外観
Part1, Part2では、画像処理に外部のフレームフィルタをロードして使用していましたが、ここではそのフレームフィルタを直接埋め込む方法を示しています。
フレームフィルタはクラスInternalContrastEnhancementに封じ込められており、そのモジュール InternalContrastEnhancement.csです。
private bool m_bEnabled = false;
private long m_lowerBound = 50;
private long m_upperBound = 250;
このフレームフィルタのクラスは3つのメンバーから成ります。これらはフィルタの振る舞いを定めます。
public void setEnable( bool bEnable )
{
m_bEnabled = bEnable;
}
プログラムはフレームフィルタクラスが提供する"get", "set"メソッドによりそのパラメータを変更する事ができます。
以下のコードではパラメータm_bEnabledを変更する方法を示しています。
public override bool Transform(IFrame src, IFrame dest)
{
byte [] LUT = new Byte [256];
unsafe
{
if( dest.Ptr == null ) return false;
BeginParameterTransfer();
bool enabled = m_bEnabled;
long upperBound = m_upperBound;
long lowerBound = m_lowerBound;
EndParameterTransfer();
for( int i = 0; i < 256; ++i )
{
if( i <= lowerBound )
{
LUT[i] = 0;
}
else if( i >= upperBound )
{
LUT[i] = 255;
}
else
{
LUT[i] = System.Convert.ToByte( System.Convert.ToDouble(i - lowerBound) /
System.Convert.ToDouble(upperBound - lowerBound) * 256.0);
}
}
byte* pIn = src.Ptr;
byte* pOut = dest.Ptr;
if( enabled )
{
int bufferSize = src.FrameType.BufferSize;
byte* pSource = src.Ptr;
byte* pTarget = dest.Ptr;
byte *pEnd = &pSource[bufferSize];
while( pSource < pEnd )
{
*pTarget = LUT[*pSource];
pSource++;
pTarget++;
}
}
else
{
int bufferSize = src.FrameType.BufferSize;
while( bufferSize-- > 0 )
{
*pOut++ = *pIn++;
}
}
}
return true;
}
コントラストの強調はメソッドTransformにより実行されます。まず、すべてのメンバーをローカルの変数にコピーします。これにより、このメソッドが実行されている間にメンバーの値が変更されても影響しません。次に、LUT(look up table)を作成します。このLUTはコントラスト調整のための輝度値修正のマップとして使用されます。
全てのピクセルが上で作成されたLUTに従って修正された値に置き換えられます。
private void Form1_Load(object sender, System.EventArgs e)
{
icImagingControl1.ShowDeviceSettingsDialog();
if( !icImagingControl1.DeviceValid )
{
Close();
return;
}
// Create an instance of the frame filter class.
MyInternalContrastEnhancement = new InternalContrastEnhancement();
// Create an abstract wrapper for the frame filter class.
TIS.Imaging.FrameFilter abstractFilter = icImagingControl1.FrameFilterCreate( MyInternalContrastEnhancement );
// Insert the filter in the device path of the image stream.
icImagingControl1.DeviceFrameFilters.Add( abstractFilter );
// Enable the image processing in the filter.
MyInternalContrastEnhancement.setEnable(true);
InitControls();
UpdateControls();
icImagingControl1.LiveStart();
}
プログラムのメインクラスで、ICImagingControlのデバイスパスにフィルタを生成する必要があります。その後、画像処理が開始できるようになります。
private void tbLowerBound_Scroll(object sender, System.EventArgs e)
{
MyInternalContrastEnhancement.setLowerBound( tbLowerBound.Value );
UpdateControls();
}
メインフォームには2つのメソッドがあります。ユーザーインターフェースの初期化と更新です。メソッド InitControlsは2つのスクロールバーtbLowerBoundとtbUpperBoundを初期化します。メソッド UpdateControlsはフィルタ内部の設定値とフォームの設定を同期します。このサンプルではフィルタの3つのプロパティメンバーを埋め込む必要があります。ここではスクロールバーtbLowerBoundのイベントハンドラーについてだけ表記しています。