영상처리

Part 4 : Sigmoid 함수 변환

dainj 2026. 2. 25. 14:46

1. Sigmoid 함수 변환 원리

Sigmoid 변환은 입력 영상 s를 결과 영상 r로 변환할 때, 특정 구간의 대비를 집중적으로 높이기 위해 사용한다.

여기서 alpha는 기울기(Gain), c는 중심점(Offset)을 의미한다.

변환식

  • 입력 영상 및 결과 영상의 범위는 0 ~ 255가 아니라 0 ~1로 정규화하여 계산한다.
  • alpha=8, c=0.5인 경우, 입력값 0.5 부근에서 변화량이 가장 크며 비선형적인 곡선을 형성한다.
  • 이 변환을 통해 의료 영상 내의 특정 밝기 영역을 더욱 선명하게 강조할 수 있다.


2. 실습 : Sigmoid 변환 LUT 생성 및 시각화

Sigmoid 함수를 이용하여 LUT를 생성하고, 이를 그래프로 그려 변환 특성을 확인한다.

 

[실습 코드: Sigmoid LUT 생성 및 그래프 출력]

Python
import cv2
import numpy as np
from google.colab.patches import cv2_imshow

# LUT 생성 함수 (Sigmoid 변환 적용)
def power_transform(gamma, LUT): # PDF 내 함수명이 power_transform으로 되어 있음
    i = 0
    for i in range(0, 256):
        # 0~255 -> 0~1 정규화 후 sigmoid 계산 / c = gamma
        tmp = 255.0 * (1 / (1 + np.exp(-a * ((i / 255.0) - gamma))))
        if tmp > 255:
            tmp = 255
        LUT[i] = tmp

# 그래프 그리는 함수
def view_1d(mat, size, data, DX, DY, yscale):
    cv2.rectangle(mat, (0, 0), (256, 256), (0, 0, 0), -1)
    i = 0
    for i in range(0, size - 1):
        cv2.line(mat, (DX + i, DY - yscale * data[i]),
                 (DX + i + 1, DY - yscale * data[i + 1]), (0, 128, 0), 2)

# 2차원 컬러 이미지 생성 및 시각화
view = np.zeros((256, 256, 3), np.uint8)
LUT = np.zeros(256, np.uint8)
gamma = 0.5 # 중심점 c 역할
a = 11      # 기울기 alpha
power_transform(gamma, LUT)
view_1d(view, 256, LUT, 0, 256, 1)
cv2_imshow(view)

 

4.3 실습 : 의료 영상(Chest X-ray)에 Sigmoid 변환 적용

실제 흉부 X-ray 영상에 Sigmoid 변환을 적용하여 대조도가 향상된 결과를 얻는다.

 

[실습 코드: Sigmoid 변환 적용]

Python
import cv2
import numpy as np

# Sigmoid 변환을 위한 LUT 생성 함수
def power_transform(gamma, LUT):
    i = 0
    for i in range(0, 256):
        # 0~255 -> 0~1 정규화 후 sigmoid 계산
        tmp = 255.0 * (1 / (1 + np.exp(-a * ((i / 255.0) - gamma))))
        if tmp > 255:
            tmp = 255
        LUT[i] = tmp

# 영상 로드 및 준비
image = cv2.imread("/content/drive/MyDrive/의료영상대이타/chest.bmp", cv2.IMREAD_GRAYSCALE)
dst = image.copy()

# 파라미터 설정
gamma = 0.3 # 중심점
a = 9       # 기울기

# LUT 생성
LUT = np.zeros(256, np.uint8)
power_transform(gamma, LUT)

w = image.shape[1]
h = image.shape[0]

# 영상 변환 적용
for i in range(0, h):
    for j in range(0, w):
        dst[i][j] = LUT[image[i][j]]

from google.colab.patches import cv2_imshow
cv2_imshow(image)
cv2_imshow(dst)