ImageJでコントラストを上げる(任意の閾値を設定する方法)
フリーの画像処理ソフトウェアであるImageJを使用し、画像のコントラストを強調する方法についての記事です。
"Process”→”Enhance contrast””という方法もありますが、その方法は本記事では扱いません。
【方法】MinとMaxを設定するだけ
"Image" → "Adjust" → ”Brightness/Cantrast" の順にクリック。
(ショートカットキー:Ctrl + Shift + C)
MinとMaxの間隔を狭くしてApplyを押すだけで完了。この際、BrightnessとContrastが勝手に変わりますが問題ありません。
※Applyを押す前ならResetで戻せます。Apply押してしまった後は戻せないので、画像を保存せずに閉じて最初からやり直してください。
以下のようにヒストグラムが伸長されていたらOKです。私は頻繁にApplyを押し忘れます。「保存した画像を見たらコントラストが変わってなかった」いう場合は大体Applyの押し忘れです。
【補足】Contrastの調節バーは動かさなくて良いのか?
Contrastの調節バーを右に動かすと、MinとMaxが両側から均等に狭くなります。
結局、同じことをしているので、MinとMaxを動かすだけでOK。
もちろん「MinとMaxは触らずContrastだけ変える」というのもアリですが、
・ヒストグラムが左右いずれかに偏っている
・限界までコントラストを上げたい
そんな時は、MinとMaxを動かした方が良いかと思います。
【読まなくてOK】どんな処理が行われているのか?
つい最近までMinとmaxの調節バーを動かすだけで良いということを知らなかったため、任意の閾値でコントラストを上げたいときには以下のマクロを使っていました。(なぜ気づかなかったんだろう...)
※ImageJマクロの使い方は、こちらの記事(別タブで開きます)
※事前に"Image"→"Type"→"8-bit"で8ビッド画像に変換しておく必要があります。
※大きい画像だと処理に少し時間がかかることがあります。
※実行するとダイアログが表示されるので、Min、Maxの順に入力してください。
//閾値を入力させる
min = getNumber("Enter Min Value", 0);
max = getNumber("Enter Max Value", 0);
//画像サイズの取得
width = getWidth;
height = getHeight;
//座標の初期化
x = 0;
y = 0;
//全てのピクセルの値を変更
for (i = 0; i < width; i++) {
for (j = 0; j < height; j++) {
val = getPixel(x, y);
if(val <= min) {
val = 0;
} else if (val >= max) {
val = 255;
} else {
val = (val - min) * (255/(max - min));
}
setPixel (x, y, val);
y++;
}
y = y - height;
x++;
}
原理としては、下の式でピクセル値(黒が0、白が255で256段階で表されている)を書き換えています。それを入れ子のfor文でループさせ、全てのピクセルに対して行っています。
本記事で紹介した方法は、このマクロ実行時と画像の見た目が同じでした。そのため、ヒストグラム伸長の仕組みは下の式で合っていると思います。
以上、任意の閾値を設定してコントラストを上げる方法でした。 ImageJは無料なのに高機能で、使いこなせたら非常に便利だと思うのですが、 直感的な操作がしづらく、ネットに情報が少ないので日々苦戦しています。