【이미지 처리】 포스터 라이제이션

1. 개요



화상 처리의 기본적인 기술, 「포스터리제이션」을 소개합니다. 포스터 라이제이션은 계단상의 톤 커브에 의한 변환으로 출력 픽셀 값을 몇 단계로 제한하는 기법입니다.

아래 그림과 같이 입력 영상의 화소값을 n단계(아래 그림은 4단계)로 하여 출력 영상의 화소값을 제한합니다. 그렇게 함으로써 경계선이 선명해지고 예술 같은 색조를 표현할 수 있습니다.

포스터리제이션은 책 「디지털 화상 처리」에 기재된 처리방법을 답습하고 있습니다. 처리 후의 화상에 화소치 0, 255를 남기는 톤 커브를 사용하므로 콘트라스트의 뚜렷한 화상이 되고 있습니다.



2. 환경



포스터리제이션 처리를 시도한 환경은 다음과 같습니다.

파이썬 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의 인풋과 아웃풋을 나누거나 하고 있습니다만, 자세한 것은 코드의 코멘트란을 참고로 해 주세요.

posterization.py
#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. 참고문헌



★책
· 디지털 화상 처리[개정 제2판] (공익 재단법인 화상 정보 교육 진흥 협회(CG-ARTS))

★사이트
· OpenCV – cv2.LUT 사용법, 감마 보정, 네거티브 포지티브 반전, 포스터 라이제이션

· digitize 사용법(numpy)

좋은 웹페이지 즐겨찾기