コントラストの強調 - Part 2
Part1を発展させ、カスタマイズしたコントロールによりフレームフィルタのパラメータを設定する方法を示しています。
Software | IC Imaging Control 3.4, Visual Studio™ 2019 |
---|---|
サンプル(C#) | contrast_enhancement2_cs_3.4.zip |
サンプル(VB.NET) | contrast_enhancement2_vb_3.4.zip |
Frame Filter(C++ project) | contrast_enhancement_vc7_framefilter_3.4.zip |
"Contrast Enhancement"フレームフィルタの VC++ .NETプロジェクトも上記よりダウンロードが可能ですが、このフィルタはサンプルに含まれており、また部品として使用されているので、使用についてはその内容の理解は必要ありません。
このフィルタはそのヒストグラムを広げる働きをします。フィルタに上限値と下限値を設定し、その範囲の輝度値を広げて表示します。下限値よりも暗いピクセルはすべて輝度値0に、上限値よりも明るいピクセルはすべて輝度値255となります。
タイプTIS.Imaging.FrameFilterの変数filterはクラスForm1の中で宣言する必要があります。この変数はフレームフィルターを含み、その接続に使用されます。
private TIS.Imaging.FrameFilter filter;
Dim filter As TIS.Imaging.FrameFilter
フレームフィルタの上限値と下限値は2つのスクロールバー(sldLowerBound, sldUpperBound)で設定することができます。プログラムのメインフォームでは、以下で定義される2つの関数をコールしています。
private void Form1_Load(object sender, System.EventArgs e)
{
icImagingControl1.ShowDeviceSettingsDialog();
if (!icImagingControl1.DeviceValid)
return;
filter = icImagingControl1.FrameFilterCreate("ContrastEnhancement", "");
// ICのデバイスバスにフレームフィルタを挿入します
icImagingControl1.DeviceFrameFilters.Add(filter);
// フィルタをEnableにします
cbEnable.Checked = true;
// Enableチェックボックスを初期化します
filter.SetBoolParameter("Enable", cbEnable.Checked);
InitControls();
UpdateControls();
icImagingControl1.LiveStart();
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
IcImagingControl1.ShowDeviceSettingsDialog()
If Not IcImagingControl1.DeviceValid Then
'Unload(Me)
Exit Sub
End If
filter = IcImagingControl1.FrameFilterCreate("ContrastEnhancement", "")
' ICのデバイスバスにフレームフィルタを挿入します
IcImagingControl1.DeviceFrameFilters.Add(Filter)
' Enableチェックボックスを初期化します
filter.SetBoolParameter("Enable", True)
InitControls()
UpdateControls()
IcImagingControl1.LiveStart()
End Sub
関数InitControlsでスクロールバーsldLowerBoundとsldUpperBoundの最小値、最大値をそれぞれ初期化します。
private void InitControls()
{
sldLowerBound.Minimum = 0;
sldLowerBound.Maximum = 255;
sldUpperBound.Minimum = 0;
sldUpperBound.Maximum = 255;
}
Private Sub InitControls()
sldLowerBound.Minimum = 0
sldLowerBound.Maximum = 255
sldUpperBound.Minimum = 0
sldUpperBound.Maximum = 255
End Sub
関数UpdateControlsはフィルタのパラメータ "Enable", "Lower Bound", "Upper Bound" をそれぞれチェックボックスcbEnable、スクロールバーsldLowerBoundとsldUpperBound に割り当てます。
private void UpdateControls()
{
if (filter.GetBoolParameter("Enable"))
cbEnable.Checked = true;
else
cbEnable.Checked = false;
sldLowerBound.Value = filter.GetIntParameter("Lower Bound");
txLowerBound.Text = sldLowerBound.Value.ToString();
sldUpperBound.Value = filter.GetIntParameter("Upper Bound");
txUpperBound.Text = sldUpperBound.Value.ToString();
}
Private Sub UpdateControls()
If filter.GetBoolParameter("Enable") Then
cbEnable.Checked = True
Else
cbEnable.Checked = False
End If
sldLowerBound.Value = filter.GetIntParameter("Lower Bound")
txLowerBound.Text = sldLowerBound.Value
sldUpperBound.Value = filter.GetIntParameter("Upper Bound")
txUpperBound.Text = sldUpperBound.Value
End Sub
スクロールバーsldLowerBoundのイベントハンドラーではその値がsldUpperBoundの値と同じか、それよりも小さい事を確認しています。その後、その値はパラメータが"Lower Bound"に適用され、そのテキストも更新されます。スクロールバーsldUpperBound のイベントハンドラーについても同様です。
private void sldLowerBound_Scroll(object sender, System.EventArgs e)
{
if (sldLowerBound.Value >= sldUpperBound.Value)
sldLowerBound.Value = sldUpperBound.Value - 1;
filter.SetIntParameter("Lower Bound", sldLowerBound.Value);
txLowerBound.Text = sldLowerBound.Value.ToString();
}
private void sldUpperBound_Scroll(object sender, System.EventArgs e)
{
if (sldUpperBound.Value <= sldLowerBound.Value)
sldUpperBound.Value = sldLowerBound.Value + 1;
filter.SetIntParameter("Upper Bound", sldUpperBound.Value);
txUpperBound.Text = sldUpperBound.Value.ToString();
Private Overloads Sub sldLowerBound_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sldLowerBound.Scroll
If sldLowerBound.Value >= sldUpperBound.Value Then
sldLowerBound.Value = sldUpperBound.Value - 1
End If
filter.SetIntParameter("Lower Bound", sldLowerBound.Value)
txLowerBound.Text = sldLowerBound.Value
End Sub
Private Overloads Sub sldUpperBound_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sldUpperBound.Scroll
If sldUpperBound.Value <= sldLowerBound.Value Then
sldUpperBound.Value = sldLowerBound.Value + 1
End If
filter.SetIntParameter("Upper Bound", sldUpperBound.Value)
txUpperBound.Text = sldUpperBound.Value
End Sub