第2週
C#による画像処理(濃度反転、階調数変換、解像度変換)


【操作1】新しいプロジェクト(CsProg2)の作成

 ツールボックスから、メインメニュー(MainMenu)の貼り付けとオープンファイルダイアログ(OpenFileDialog)の貼り付けを行う。



後者はツールボックスの下方にある。スクロールしてアイコンをダブルクリックしよう。フォームウィンドウの下方にアイコンが2つ表示されている(下図参照)。



 グループボックスの張り付けとその中に置かれるラベル、リストボックス(lstNumLevel、lstNumBlock)各2組を貼り付ける。
 さらに、ピクチャーボックスを2つ貼り付ける。これらのプロパティは2ヶ所変更しよう。
@ ツールボックスのメインメニューのアイコンをダブルクリックする。
A ツールボックスを下にスクロールし、オープンファイルダイアログを表示させ、ダブルクリックする。
B グループボックスを2つフォームに貼り付け、プロパティの「Text」を「階調数変換」と「解像度変換」に変更する。



C 各グループボックスにラベルとリストボックスを貼り付け、ラベルの「Text」を「階調数」と「画素数」に変更する。
D リストボックスの「(Name)」をlstNumLevelとlstNumBlockに変更する。
E ピクチャーボックスを2つ貼り付ける。プロパティの「BorderStyle」を「Fixed3D」に変更する。さらに、「Size」を「128, 128」にしておこう。

ここまで作業が終わると、下図のようになっている。





【操作2】メインメニューの作成

 つぎにメニューの作成を行う。
@ フォームウィンドウの「MainMenu」アイコンをクリックする。
A 「ここへ入力」と書いてある部分をクリックし、「ファイル」と入力する。



B 下と右の2ヶ所に「ここへ入力」が表示されているので、そこに以下のように入力する。
C また、Bの操作終了後に「(Name)」も変更しておく。



【操作3】ピクチャーボックスの略語置き換え、定数の指定
 これで、画像処理操作の準備ができたので、コードを記述して行く。まず、ピクチャーボックスの「(Name)」は長いので短い名前に変更して扱うことにする。これは、プログラム起動時に変更されておく必要があるので、「Form_Load」関数にコードを記述する。
@ フォームのどこかをダブルクリックする。
A 下のコードを記述する。Form_Load関数の外側に2行、重要なコードがあるので気をつけること。ここに記述することで、このプログラムでは共通して使用できることになる。GMAXは【操作5】で使用することになる。



 上記コードでわかるように、C言語では必須のMainという関数が存在している。C#では開発環境が準備していてくれる。



【操作4】ピクチャーボックスへのビットマップデータの読み込み

 「pictureBox1」に取り込むためのコードを記述しよう。
@ メニューの「開く」をダブルクリックする。
A 下のコードを記述する。



これで、ファイルを読み込むことができるようになっているはずである。



【操作5】濃度反転

 各ピクセル(≒ドット)のRGBの濃度を取得して、最大値(GMAX)から引くことで濃度反転ができる。





【操作6】実行
 
実行して、「matumae.bmp」を読み込んでみよう。その後で、濃度反転を行うことにする。
画像ファイルは以下の画像を用いること。

上記の画像の上にマウス・カーソルを合わせ、右クリックでサブメニューを開き、「名前をつけて画像を保存」をクリックし、適当なフォルダに保存して使用してください。

@ 「開く」をクリックして、「matumae.bmp」を読み込む。
A 「濃度反転(color)」をクリックする。下図のようになる。





【操作7】階調数変換

【操作6】の実行図を見ればわかるように、各グループボックスの中のリストボックスは空白である。ここでは、これにデータを入れ、階調数変換のコードも追加する。
@ Form_Load関数に以下のコードを追加する。



A メニューの「階調数変換」をダブルクリックする。
B 現れた「P1_Level_Click」関数に以下のコードを記述する。



C 実行する。
D ファイルを読み込む。
E 階調数は256になっているので、リストボックスの右についているボタンをクリックし「4」を表示する。
F 表示されている「4」をクリックする。
G メニュー「処理」の「階調数変換」をクリックする。

結果が以下のようになる。





【操作8】解像度変換

 最後に、解像度によって画像がどのように変換されるか見てみよう。作成手順は、【操作7】とほぼ同じである。