【이미지 처리】 포스터 라이제이션
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)
Reference
이 문제에 관하여(【이미지 처리】 포스터 라이제이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ZESSU/items/01b5cefbef7112722f45
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
포스터리제이션 처리를 시도한 환경은 다음과 같습니다.
파이썬 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)
Reference
이 문제에 관하여(【이미지 처리】 포스터 라이제이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ZESSU/items/01b5cefbef7112722f45
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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()
★책
· 디지털 화상 처리[개정 제2판] (공익 재단법인 화상 정보 교육 진흥 협회(CG-ARTS))
★사이트
· OpenCV – cv2.LUT 사용법, 감마 보정, 네거티브 포지티브 반전, 포스터 라이제이션
· digitize 사용법(numpy)
Reference
이 문제에 관하여(【이미지 처리】 포스터 라이제이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ZESSU/items/01b5cefbef7112722f45텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)