#1. 概要
画像処理の基本的な技術、「ポスタリゼーション」を紹介します。ポスタリゼーションとは、階段上のトーンカーブによる変換で、出力画素値を数段階に制限する手法です。
下図のように入力画像の画素値をn段階(下図は4段階)にして、出力画像の画素値を制限します。そうすることで境界線が鮮明になり、アートのような色合いを表現することが出来ます。
ポスタリゼーションは書籍「ディジタル画像処理」に記載されている処理方法を踏襲しています。処理後の画像に画素値0、255を残すようなトーンカーブを使用するのでコントラストのはっきりとした画像となっています。
#2. 環境
ポスタリゼーション処理を試した環境は以下となっています。
Python 3.6.8
numpy 1.18.1
matplotlib 3.1.2
opencv-python 4.1.2.30
ライブラリでOpenCVを使用するので事前にインストールをお願いします。
pip install opencv-python
#3. コード
ポスタリゼーションについていろいろなサイトを見てところ、多くのサイトでは画素値255のホワイトは出力画像に反映しないLUTを使用していました。
今回の処理は画素値255「ホワイト」も出力画像に反映しているので、LUT作りを工夫しました。
binsのインプットとアウトプットを分けたりしていますが、詳細はコードのコメント欄を参考にしてくださいね。
#coding: utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
def main():
img = cv2.imread('image.jpg') #画像の読み込み
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) #グレースケール化
n = 4 # 画素値の分割数
pos = posterization(gray, n)
cv2.imwrite('pos.jpg', pos) #ポスタリゼーションした画像の出力
def posterization(img, n):
x = np.arange(256) #0,1,2...255までの整数が並んだ配列
ibins = np.linspace(0, 255, n+1) #LUTより入力は255/(n+1)で分割
obins = np.linspace(0,255, n) #LUTより出力は255/nで分割
num=np.digitize(x, ibins)-1 #インプットの画素値をポスタリゼーションするために番号付けを行う
num[255] = n-1 #digitize処理で外れてしまう画素値255の番号を修正する
y = np.array(obins[num], dtype=int) #ポスタリゼーションするLUTを作成する
pos_LUT(n, y) #LUTの図を作成
pos = cv2.LUT(img, y) #ポスタリゼーションを行う
return pos
#ポスタリゼーションのLUT図作成
def pos_LUT(n, y):
x = np.arange(0,256,1)
plt.plot(x,y)
plt.savefig("pos_LUT.png")
if __name__=='__main__':
main()
#4. 参考文献
★書籍
・[ディジタル画像処理[改訂第二版] (公益財団法人 画像情報教育振興協会(CG-ARTS))][0]
[0]:https://www.amazon.co.jp/%E3%83%87%E3%82%A3%E3%82%B8%E3%82%BF%E3%83%AB%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86-%E6%94%B9%E8%A8%82%E7%AC%AC%E4%BA%8C%E7%89%88-%E3%83%87%E3%82%A3%E3%82%B8%E3%82%BF%E3%83%AB%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86%E7%B7%A8%E9%9B%86%E5%A7%94%E5%93%A1%E4%BC%9A/dp/490347464X/ref=asc_df_490347464X/?tag=jpgo-22&linkCode=df0&hvadid=342595526565&hvpos=&hvnetw=g&hvrand=5492134153117811443&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009247&hvtargid=pla-889374643658&psc=1&th=1&psc=1
★サイト
・[OpenCV – cv2.LUT の使い方、ガンマ補正、ネガポジ反転、ポスタリゼーション][1]
[1]:https://pystyle.info/opencv-tone-transform/#outline__6
・[digitizeの使い方(numpy)][2]
[2]:http://arduinopid.web.fc2.com/Q3-36.html