この記事で扱っていること
- 画像にガンマ補正をかける方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
カメラで撮影した画像を加工する方法の一つとしてガンマ補正があります。
暗い画像を明るくする、あるいは明るすぎる画像を暗くする、といった処理を施したり、そのあとの別の画像処理用のための前処理として実装します。
今回はルックアップテーブル調でガンマ補正値をあらかじめ用意しておき、各ピクセル値に対して対応するガンマ補正値を調べ上げるという実装にしてみました。
どんな結果になるか
フロントパネルには画像ファイルパス制御器とガンマ値およびズーム係数を指定する数値制御、そして加工前と加工後の画像を表示するピクチャ表示器を配置しています。

プログラムを実行し、ガンマ値を変更することで、画像に対しガンマ補正をかけることができます。

プログラムの構造
今回は一つのWhileループおよびイベントストラクチャで実装しています。
紹介のためにこのように書いていますが、イベントストラクチャの中に具体的な処理を入れることは本来避けるべき書き方なので、適宜別ループでの処理にするようにしてください。

各イベントとして、ファイルパス制御器の値変更イベントでは、画像ファイルを読み取って画像データを抽出、その画像データから2次元のピクセル値配列に変換してシフトレジスタに渡しています。

ガンマ値の値変更イベントでは、指定されたガンマ値によってあらかじめ補正値を計算しておきます。
補正値の計算は、加工前のピクセル値をx、加工後のピクセル値をyとすると
y=255*(x/255)^gamma
となるので、これを0~255のとりうる全ピクセル値に対してあらかじめ計算しておき配列化しておいてルックアップテーブルとしておき、実際の画像の2次元配列のそれぞれの要素に対して適用しています。
カラー画像の場合、R、G、Bの各要素に分解すると、それぞれの要素は0~255のピクセル値をとるので、これをそのままルックアップテーブルの指標として扱えます。
R、G、Bそれぞれに処理をしおえたらこれらを再び合成して画像として表示します。

他のイベントとしてはズーム係数の値変更イベントを作っています。
加工前も加工後も画像のサイズは同じなので、どちらのピクチャにも同じズーム係数を適用します。

画像ファイル変更後に自動でガンマ補正をかける
上で紹介したプログラムだと、プログラムの途中で画像ファイルパスを変更すること自体はできるのですが、そのあとにガンマ値の値を変更しないとガンマ値値変更イベントが発生しないため、画像を変更して同じガンマ値を使用して加工するのに1アクションはいります。
この1アクションを減らし、画像ファイルパスを変更したらすぐにガンマ補正をかけるようにするためのプログラムの書き方はいくつかありえますが、一つのWhileループ(とイベントストラクチャ)で実装する場合には、ユーザイベントを定義するのが楽だと思います。

画像ファイルパスの値変更イベントの時点でユーザイベントを起こさせ、ガンマ値の値変更イベントとユーザイベントを同じ内容としておくだけです。

本記事では画像に対してガンマ補正をかける方法を紹介しました。
画像加工の方法はこれまでにもいくつか紹介してきましたが、ルックアップテーブルを使って簡単に実装できる方法があることを知り記事にしてみました。
様々な画像加工、画像処理の前処理方法として参考になればうれしいです。
ここまで読んでいただきありがとうございました。

コメント