OpenCV 강좌, CLAHE(Contrast Limited Adaptive Histogram Equalization)

이 글에서는 OpenCV를 사용하여 CLAHE(Contrast Limited Adaptive Histogram Equalization)에 대한 방법과 개념을 다룰 것입니다. CLAHE는 이미지의 대비를 향상시키기 위해 주로 사용되는 기술로, RETINEX 기반의 방법을 이용해 이미지를 보정합니다.

1. CLAHE란 무엇인가?

CLAHE는 Contrast Limited Adaptive Histogram Equalization의 약자로, 전통적인 히스토그램 평활화의 한계를 극복하기 위해 제안된 기법입니다. 본 기법은 이미지의 명암비를 높여 작은 세부사항의 가시성을 향상시키면서, “과도한 대비”를 방지합니다. 일반적으로 히스토그램 평활화는 전체 이미지에 대해 동일한 변화율을 적용하지만, CLAHE는 이미지의 여러 지역에 다른 변화율을 적용하여 더 효과적인 결과를 생성합니다.

1.1 CLAHE의 원리

CLAHE는 이미지를 여러 개의 작은 블록으로 나누고, 각 블록에 대해 히스토그램 평활화를 수행합니다. 그런 다음, 블록에서 얻은 결과를 병합하여 전체 이미지를 생성합니다. 이 과정에서, 대비가 지나치게 커지는 것을 방지하기 위해 ‘대비 제한’을 설정합니다. 이로 인해 과도한 대비가 발생하지 않고 더 자연스러운 이미지를 얻을 수 있습니다.

2. OpenCV에서 CLAHE 구현하기

OpenCV에서는 CLAHE를 쉽게 사용할 수 있습니다. 다음은 Python을 사용해 CLAHE를 구현하는 방법에 대한 단계별 설명입니다.

2.1 OpenCV 설치

CLAHE를 사용하기 위해 OpenCV 패키지를 설치해야 합니다. 터미널에서 아래의 명령어를 입력하여 OpenCV를 설치합니다.

pip install opencv-python

2.2 CLAHE 구현 예제

다음은 CLAHE를 사용한 이미지 대비 향상 예제입니다.

python
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 이미지 로드
image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)

# CLAHE 객체 생성
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))

# CLAHE 적용
clahe_image = clahe.apply(image)

# 원본 이미지와 CLAHE 이미지 비교
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title('원본 이미지')
plt.imshow(image, cmap='gray')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.title('CLAHE 이미지')
plt.imshow(clahe_image, cmap='gray')
plt.axis('off')

plt.show()

위의 코드는 ‘input_image.jpg’ 파일을 읽고 CLAHE를 적용하여 원본 이미지와 대비 향상된 이미지를 비교하여 보여줍니다. 각 블록은 8×8 크기로 나누어져 있으며, clipLimit는 대비 제한의 값입니다.

3. 매개변수 조정

CLAHE의 성능은 몇 가지 매개변수에 따라 달라질 수 있습니다. 주요 매개변수는 다음과 같습니다.

3.1 clipLimit

clipLimit는 대비를 제한하는 값입니다. 이 값이 커질수록 이미지의 대비가 증가하지만, 과도한 대비가 발생할 수 있습니다. 일반적으로 2.0 또는 3.0의 값을 사용합니다. 적절한 clipLimit 값을 설정하는 것이 중요합니다.

3.2 tileGridSize

tileGridSize는 CLAHE가 적용될 블록의 크기입니다. 작은 크기의 블록은 세부사항을 더 잘 보존하지만, 노이즈를 증가시킬 수 있습니다. 반면, 큰 블록 크기는 덜 효과적일 수 있습니다. 일반적으로 8×8이나 16×16의 값을 선택합니다.

3.3 조합 예제

다양한 매개변수를 조정하여 이미지를 처리하고 결과를 비교해보세요.

python
# 여러 clipLimit와 tileGridSize 테스트
clip_limits = [1.0, 2.0, 3.0]
tile_sizes = [(8, 8), (16, 16), (32, 32)]

plt.figure(figsize=(15, 10))
for i, clip_limit in enumerate(clip_limits):
    for j, tile_size in enumerate(tile_sizes):
        index = i * len(tile_sizes) + j
        clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=tile_size)
        clahe_image = clahe.apply(image)

        plt.subplot(len(clip_limits), len(tile_sizes), index + 1)
        plt.imshow(clahe_image, cmap='gray')
        plt.title(f'clipLimit {clip_limit}, tileGridSize {tile_size}')
        plt.axis('off')

plt.tight_layout()
plt.show()

4. CLAHE의 적용 사례

CLAHE는 여러 분야에서 널리 사용됩니다. 특히 의료 영상 처리 및 위성 이미지 처리에 유용하게 사용됩니다.

4.1 의료 영상 처리

의료 영상에서는 세부사항이 중요한 역할을 합니다. CLAHE를 통해 CT 또는 MRI 이미지에서 세부사항을 더 잘 보존할 수 있습니다.

4.2 위성 이미지 처리

위성 이미지에서도 CLAHE는 대비를 향상시켜 지형을 더 선명하게 만들어 줍니다. 지형 분석 및 자원 탐사에서 중요한 역할을 합니다.

5. 성능 비교

CLAHE의 효과를 다른 대비 향상 기법과 비교할 수 있습니다. 예를 들어, 전통적인 히스토그램 평활화와 CLAHE의 결과를 비교해볼 수 있습니다.

python
# 전통적인 히스토그램 평활화
hist_equalized = cv2.equalizeHist(image)

# 결과 비교
plt.figure(figsize=(12, 6))
plt.subplot(1, 3, 1)
plt.title('원본 이미지')
plt.imshow(image, cmap='gray')
plt.axis('off')

plt.subplot(1, 3, 2)
plt.title('히스토그램 평활화')
plt.imshow(hist_equalized, cmap='gray')
plt.axis('off')

plt.subplot(1, 3, 3)
plt.title('CLAHE 이미지')
plt.imshow(clahe_image, cmap='gray')
plt.axis('off')

plt.show()

결론

CLAHE는 이미지의 대비를 효과적으로 향상시킬 수 있는 강력한 방법입니다. OpenCV를 통해 간편하게 사용할 수 있으며, 다양한 매개변수 조정을 통해 최적의 이미지를 얻을 수 있습니다. 이 기술을 활용하여 다양한 분야에서 더욱 좋은 결과를 얻을 수 있기를 바랍니다.