この記事ではpython&openCVを使って、以下の画像のように白黒画像の明暗をはっきりさせる方法をご紹介します。
具体的には上の画像に示しているように、任意の輝度基準値を中心に、各ピクセルの持つ輝度値をシグモイド関数に放り込むことによって、基準値周辺の輝度変化をより強調するということを行っています。
まぁ難しいことを言っているようですが、要するに白黒の強弱をわかりやすく変換しているだけですね。
単に二値化するだけでは、着目したい場所の微妙な輝度変化を確認することができなくなってしまいますが、今回紹介する方法なら指定輝度値近傍の輝度変化は残りますので、もとの画像の特徴を維持しながら、より特徴を強調することができるようになります。
AIに画像を放り込む際の前処理のひとつとしてぜひ使ってみてはいかがでしょうか。
それではさっそく本題に入っていきます。
※この作業をpythonというプログラミング言語を用いて実行していきます。インストールから始めたい方は以下からご覧ください。
シグモイド関数とは
まず始めに、今回画像の輝度値変換に用いるシグモイド関数についてご紹介しておきます。
シグモイド関数は以下の式にて表されます。※a>0
なにやら難しげな数式ですね。
これを見てどんな関数かわかる人はほとんどいないと思いますのでグラフに起こしてみましょう。
以下がその結果です。
特徴としては以下の通りです。
〇最大が1で、最小が0
〇x=0で0.5になる。
〇x=0近傍で値の変化が大きく、それ以外では変化が小さい
今回の画像の変換にシグモイド関数を用いるのは、3つめの【x=0近傍で値の変化が大きく、それ以外では変化が小さい】という特徴を利用するためです。
この特徴を使うことによって、指定した輝度値周辺の輝度を有しているピクセルはその輝度値からの変化をより強調して表示してくれるようになります。
なお、画像の明るさは一般的に0~255の範囲で表現されますので、このあたりのレンジ域でうまく関数が機能するように、シグモイド関数の係数aは0.1に設定しています。
以下がa=0.1のときのシグモイド関数のグラフです。
基準値からだいたい±20くらいの輝度をもっているピクセルは輝度が大きく変化することになるでしょう。
前置きはこのくらいにして実際の作業に入っていきましょう。
必要なライブラリの準備
以下が今回使用するライブラリです。
〇numpy
⇒シグモイド関数を使うために必要
〇openCV
⇒画像処理全般に使用
numpy はAnacondaを使用すればあらかじめインストールされていますが、openCVは自分で追加インストールが必要です。
openCVのインストール方法については以下の記事で解説しています。
画像を強調するサンプル画像の紹介
今回はいつものように以下の画像を使って実現していきます。
真っ白、真っ黒以外にも様々なグレーが存在していることがわかると思います。
このグレー領域がどのように変化するか着目してみていきましょう。
画像の輝度をシグモイド関数で強調するサンプルコード
それでは前置きが長くなりましたが、以下が画像の輝度にシグモイド関数を適用し、輝度変化を強調するサンプルコードです。
※今回は基準となる輝度値を100としています。
#ライブラリのインポート
import numpy as np
import cv2
edge_value=10
#ベース画像の読み込み
img=cv2.imread('mouse.jpg',cv2.IMREAD_GRAYSCALE)
img=img.astype(np.float32)
#画像の輝度変化を強調する処理
edge_value=100
img_edge=img-edge_value
sigmoid=1/(1+np.exp(-0.1*img_edge))*255
sigmoid=sigmoid.astype(np.uint8)
#画像の出力
cv2.imwrite('edge_value'+str(edge_value)+'.jpg',sigmoid)
処理前後で画像を比較してみましょう。
〇処理前のもと画像
〇処理後の輝度変化強調画像
もとの画像において輝度値が100よりも大きかった場所は大幅に明るくなり、100より小さかった場所は大幅に暗くなるという処理がシグモイド関数に従って行われています。
なんとなく特徴が協調されている気がしますよね。
基準値をいろいろ変えて実行してみた結果
だいたいどんなことをやっているかわかったところで、シグモイド関数の基準値をいろいろと変化させて実行した結果を一気に紹介します。
以下が基準値を20, 60, 100, 140 ,180, 220 と変化させていった際の実行結果です。
基準値を小さくしすぎると背景まであかるくなってしまっていますね。
また基準値を大きくしすぎるとほとんどなにも見えなくなってしまっていますね。
このあたりはシグモイド関数の係数(今回は0.1)次第ではあるので、係数もいろいろ変えながら目的にあうような画像をつくっていただければと思います。
おわりに
というわけで今回は画像の輝度変化をシグモイド関数をつかって強調する方法をご紹介しました。
AIに画像を放り込む時なんかにぜひご活用ください。
このように、私のブログでは様々なスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント