2021年8月23日月曜日

【OpenCV】LUTによる画像変換

 ルックアップテーブルは入力値に対して出力値を対応させた変換表で、画像処理ライブラリOpenCVLUTを用いることで画像にルックアップテーブルを適用して変換表に応じた画像の変換ができる。


OpenCVを使うには次のようにインポートが必要。
import cv2

 例に用いる画像'karasawa.jpg'は以下を使用(フリー写真素材ぱくたそより)




1. 書式

 cv2.LUTの書式は以下の通り。

dst = cv2.LUT(src, lut[, dst)

 引数として元画像srcと適用するルックアップテーブルlutが必要。
srcは8bit(256値)の配列でlutも同じく256個の要素を持つ。カラー画像のようにsrcが多チャンネルの場合は全部のチャンネルに同じ変換が適用される。



2. LUTの適用例(画像の減色)

 LUTの適用例として画像の減色を行う。BGRチャンネルそれぞれ256値からなる16777216色の画像に対して階段状のlutを適用することでBGRチャンネルそれぞれ8値からなる512色の画像に変換する。
 ルックアップテーブルを図示すると以下の通り(横軸:変換前、縦軸:変換後)。



import cv2
import numpy as np

table = np.array([int(i//32*36.5) for i in range(256)] ,dtype=np.uint8)

img = cv2.imread('karasawa.jpg')
img = cv2.LUT(img, table)   

cv2.imwrite('karasawa512.jpg', img)

実行結果





3. LUTの適用例(チャンネルのガンマ補正)

 個別のチャンネルに対する変換例としてR(チャンネル)の強調を行う。BGRの3チャンネルのうちRチャンネルに対してのみLUT処理する。lutにはガンマカーブ(γ=0.5)を用い赤色を強調させる。ガンマ補正は最小値(0)と最大値(255)が維持される非線形補正で、γ<1の場合輝度が強調、γ>1の場合輝度が抑制される。
 ルックアップテーブルを図示すると以下の通り(横軸:変換前、縦軸:変換後)。



import cv2
import numpy as np

gamma = 0.5
table = np.array([(i/255)**gamma*255 for i in range(256)] ,dtype=np.uint8)

img = cv2.imread('karasawa.jpg')
img[:,:,2] = cv2.LUT(img[:,:,2], table)    

cv2.imwrite('karasawa_red.jpg', img)

実行結果





4. リファレンス

OpenCV > Operations on arrays > LUT()

使用したバージョン:Python 3.8.8 / OpenCV 4.0.1

0 件のコメント:

コメントを投稿