コントラストの強調 - Part 3 (Version 3.3)
プログラムに直接コントラストの強調処理を埋め込む方法を示しています。
Software | IC Imaging Control 3.3, Visual Studio™ 2010 |
---|---|
サンプル(C#) | contrast_enhancement3_cs.zip |
Part1, Part2では、画像処理に外部のフレームフィルタをロードして使用していましたが、ここではそのフレームフィルタを直接埋め込む方法を示しています。
フレームフィルタはクラスInternalContrastEnhancementに封じ込められており、そのモジュールはInternalContrastEnhancement.csです。
このフレームフィルターのクラスは3つのメンバーから成ります。これらはフィルターの振る舞いを定めます。
private bool m_bEnabled = false; // コントラスト強調の画像処理を有効/無効にするスイッチです
private long m_lowerBound = 50; // 取得された輝度値をマップする下限値です
private long m_upp
プログラムはフレームフィルタークラスが提供する"get", "set"メソッドによりそのパラメータを変更する事ができます。以下のコードではパラメータm_bEnabledを変更する方法を示しています。
public void setEnable( bool bEnable )
{
m_bEnabled = bEnable;
}
コントラストの強調はメソッドTransformにより実行されます。まず、すべてのメンバーをローカルの変数にコピーします。これにより、このメソッドが実行されている間にメンバーの値が変更されても影響しません。
BeginParameterTransfer();
bool enabled = m_bEnabled;
long upperBound = m_upperBound;
long lowerBound = m_lowerBound;
EndParameterTransfer();
次に、LUT(look up table)を作成します。このLUTはコントラスト調整のための輝度値修正のマップとして使用されます。
for( int i = 0; i < 256; ++i )
{
if( i <= lowerBound )
{
LUT[i] = 0;
}
else if( i >= upperBound )
{
LUT[i] = 255;
}
else
{
// 設定された下限値~上限値の間を0~255に変更する変換マップ
LUT[i] = System.Convert.ToByte( System.Convert.ToDouble(i - lowerBound) /
System.Convert.ToDouble(upperBound - lowerBound) * 256.0);
}
}
全てのピクセルが上で作成されたLUTに従って修正された値に置き換えられます。
while( pSource < pEnd )
{
*pTarget = LUT[*pSource];
pSource++;
pTarget++;
}
プログラムのメインクラスで、ICImagingControlのデバイスパスにフィルタを生成する必要があります。その後、画像処理が開始できるようになります。
// フレームフィルタクラスのインスタンスを生成
MyInternalContrastEnhancement = new InternalContrastEnhancement();
// フレームフィルタクラスのアブストラクトラッパーを生成
TIS.Imaging.FrameFilter abstractFilter = icImagingControl1.FrameFilterCreate( MyInternalContrastEnhancement );
// イメージストリームのデバイスパスにフィルタを挿入
icImagingControl1.DeviceFrameFilters.Add( abstractFilter );
// フィルタに画像処理を有効に設定します
MyInternalContrastEnhancement.setEnable(true);
メインフォームには2つのメソッドがあります。ユーザーインターフェースの初期化と更新です。メソッド InitControlsは2つのスクロールバーtbLowerBoundとtbUpperBoundを初期化します。メソッド UpdateControlsはフィルタ内部の設定値とフォームの設定を同期します。このサンプルではフィルタの3つのプロパティメンバーを埋め込む必要があります。ここではスクロールバーtbLowerBound のイベントハンドラーについてだけ表記しています。
private void tbLowerBound_Scroll(object sender, System.EventArgs e)
{
MyInternalContrastEnhancement.setLowerBound( tbLowerBound.Value );
UpdateControls();
}