# 시그모이드 함수 sigmoid_table(m=0.5, w=0.5, E=8)
- 중간값을 기준으로 중간값보다 작은 값은 더 작게 중간값보다 큰 값은 더 크게 하여,, 어두운 곳은 더 어둡게 밝은 곳은 더 밝게 변함
- 명암의 대조비 강화시킴
- 중간값(m), 강화 강도(w), 기울기(E)를 매개 변수로 입력 받음
- r은 x축 데이터로 0~1 사이의 float64형 256 btye 배열임
- s는 시그모이드 변환 테이블로 수식 연산 (w/(1+(m/r+eps))**E))+(1-w)*r 을 수행한 결과 값임(Loop Up Table)
- 이 함수는 x축 데이터와 변환 테이블 반환함
- 이 테이블을 이용하여 sigmoid_table[img]를 하면 픽셀 값이 인덱스로 들어감 -> 같은 화소 값에 대한 연산 중복 없어 속도 빠름
- 강화 강도가 0이면 직선 함수로 대조비 강화 없음
- 강화 강도가 1이면 가장 대조비 강함
# 시그모이드 그래프 출력
- 중간값, 강화 강도, 기울기에 대한 리스트 생성함
- 특정한 중간값과 강화 강도에 대하여 강화 강도별 그래프를 한 서브플롯에 출력함
- 예) 첫 번째 서브플롯에는 m=0.5, E=8 에 대하여 강화 강도[0.0, 0.2, 0.4, 0.8, 1.0] 에 따른 5개의 그래프를 출력함.
- 강화 강도가 클수록 그래프가 급격히 감소, 증가함
- 각각의 서브플롯 별로m, w, E값을 제목에 표시함
- 마진 제거를 하여 화면에 나타냄
- x 범위는 [0,1], y범위는 [0,1]
- x, y축에 대한 레이블 표시함
- 왼쪽 상단에 강화 강도에 대한 범례를 표시함(5개 표시됨)
- 그래프를 화면에 그림
이 그래프는 그림 7.1.7와 동일함
# 필요한 모듈 import
- numpy, matplotlib.pyplot, sys
- sys는 eps값을 얻기 위함
- eps는 분모가 0이 될 경우를 대비하여 0보다 큰 극히 작은 수를 더함
import numpy as np
import matplotlib.pyplot as plt
import sys
eps = sys.float_info.epsilon # 분모가 0이 될 경우 대비
def sigmoid_table(m=0.5, w=0.5, E=8): # 시그모이드 함수 (중간값, 강화강도, 기울기)
r = np.arange(0, 256) / 255.0 # x축 데이터 (0~1)
s = (w / (1 + (m / (r + eps)) ** E)) + (1 - w) * r # LUT
return r, s
m_list = [0.5, 0.5, 0.6, 0.7] # 중간값 리스트
w_list = [0.0, 0.2, 0.4, 0.8, 1.0] # 강화강도 리스트
E_list = [8, 20, 8, 20] # 기울기 리스트
plt.figure('sigmoid_transform')
for i, (m, E) in enumerate(zip(m_list, E_list)): # 중간값, 기울기에 대한 반복
plt.subplot(2, 2, i + 1)
plt.title("Sigmoid Function: m=" + str(m) + " E=" + str(E), fontsize=10) # 그래프 제목 설정
for w in w_list: # 강화강도에 대해 반복
# 그래프 그리기
plt.plot((sigmoid_table(m, w, E))[0], (sigmoid_table(m, w, E))[1], label="w=" + str(w))
plt.autoscale(enable=True, axis='both', tight=True) # 마진 제거
plt.grid() # 그리드 표시
plt.axis([0, 1, 0, 1]) # x 범위 : [0,1] , y 범위 : [0,1]
plt.xlabel("input : r", fontstyle="italic") # x축 제목
plt.ylabel("output : S(r)", fontstyle="italic") # y축 제목
plt.legend(loc="upper left") # 범례 표시
plt.show() # 그래프 보이기
# 느낀 점
- 시그모이드 변환을 할 때 거듭제곱에 대한 오류가 나는데 이는 음수일 경우에 대한 오류인 것 같음(해결하지 못함)
- 이 프로그램을 작성하면서 matplotlib에 대한 기능을 많이 찾아보고 연습함
- 생각보다 창을 열고 그래프를 그리고 범례를 표시하는 등 부가적인 기능을 사용하는 것이 어려웠음
- 그만큼 파이썬에 많은 기능이 있다는 것을 알게 됨
- 기능을 익히는 시간이 되었음
'전공 공부 > 영상처리' 카테고리의 다른 글
Chroma Key Editor (0) | 2020.12.29 |
---|---|
UnsharpMasking 커널 기반 처리(나만의 생각..) (0) | 2020.12.29 |
UnsharpMasking 트랙 바로 시그마, 스케일 조정 (0) | 2020.12.29 |
히스토그램 명세화 작업 후 r,g,b 채널별 히스토그램 출력 (0) | 2020.12.29 |
히스토그램 스트레칭 함수 구현 (0) | 2020.12.29 |