728x90

# 시그모이드 함수 sigmoid_table(m=0.5, w=0.5, E=8)

- 중간값을 기준으로 중간값보다 작은 값은 더 작게 중간값보다 큰 값은 더 크게 하여,, 어두운 곳은 더 어둡게 밝은 곳은 더 밝게 변함

- 명암의 대조비 강화시킴

- 중간값(m), 강화 강도(w), 기울기(E)를 매개 변수로 입력 받음

- rx축 데이터로 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

- syseps값을 얻기 위함

- 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에 대한 기능을 많이 찾아보고 연습함

- 생각보다 창을 열고 그래프를 그리고 범례를 표시하는 등 부가적인 기능을 사용하는 것이 어려웠음

- 그만큼 파이썬에 많은 기능이 있다는 것을 알게 됨

- 기능을 익히는 시간이 되었음

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기