1. 히스토그램(Histogram)의 이해
히스토그램은 영상 내에서 각 밝기 값(0~255)을 가진 픽셀의 개수를 그래프로 나타낸 것이다. 이를 통해 영상의 전체적인 밝기 분포와 대비 상태를 한눈에 파악할 수 있다.

[실습 코드: Matplotlib를 이용한 히스토그램 출력]
Python
import cv2
import numpy as np
from matplotlib import pyplot as plt
from google.colab.patches import cv2_imshow
img = cv2.imread('chest.bmp', cv2.IMREAD_GRAYSCALE)
cv2_imshow(img)
# 히스토그램 출력
# ravel()은 일차원 변환
# bins = range의 같은 폭 bin의 개수
plt.hist(img.ravel(), bins=256, range=[0, 256])
plt.show()

2. Angiography(혈관 조영술) 차영상 처리
두 영상의 차이를 구한 뒤 128 오프셋을 더하고 Sigmoid 변환을 적용하여 혈관을 선명하게 추출한다.
[실습 코드: 차영상 및 대비 강조]
Python
import cv2
import numpy as np
from google.colab.patches import cv2_imshow
img1 = cv2.imread('/content/drive/MyDrive/의료영상대이타/angiography_live_image.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('/content/drive/MyDrive/의료 영상대이타/angiography_mask_image.bmp', cv2.IMREAD_GRAYSCALE)
img = img1 - img2 + 128
img = np.clip(img, 0, 255)
# Sigmoid 변환을 이용한 contrast enhance
def power_transform(gamma, LUT):
for i in range(0, 256):
tmp = 255.0 * (1 / (1 + np.exp(-a * ((i / 255.0) - gamma))))
if tmp > 255: tmp = 255
LUT[i] = tmp
dst = img.copy()
gamma, a = 0.5, 11
LUT = np.zeros(256, np.uint8)
power_transform(gamma, LUT)
for i in range(0, img.shape[0]):
for j in range(0, img.shape[1]):
dst[i][j] = LUT[img[i][j]]
cv2_imshow(dst)

3. 평균화 마스크
평균화 마스크는 영상의 특정 영역에 있는 픽셀들의 평균값을 계산하여 새로운 픽셀값으로 대체하는 방식이다.
- 평균화 효과: 영상을 부드럽게 만드는 스무딩(Smoothing) 효과가 있어 '스무딩 필터'라고도 불린다.
- 원리: 마스크 내의 모든 항목을 더한 후 항목의 개수(예: 3x3인 경우 9)로 나눈 결과와 같다.
- 마스크 구성: 3x3 평균화 마스크의 경우, 모든 계수의 값이 1/9로 동일하다.

3.2. OpenCV를 이용한 구현: blur() 함수
OpenCV에서는 평균화 마스크를 적용하기 위해 Normalized Box Filter 방식의 blur() 함수를 제공한다.

- 함수 형태: cv2.blur(src, ksize) -> dst
- 주요 파라미터:
- src: 입력 영상 (데이터 타입: CV_8U, CV_32F 등 지원)
- ksize: 커널(마스크)의 사이즈 (예: (3,3), (21,21))
3. 파이썬 실습 코드 (Google Colab 기준)
아래 코드는 검은색과 회색으로 나누어진 영상에 3x3 평균화 마스크를 적용하는 예제이다.
Python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
# 512x512 크기의 빈 영상 생성
w, h = 512, 512
image = np.zeros(shape=(w, h), dtype=np.uint8)
# 하단 절반을 밝기값 128(회색)로 채움
for i in range(int(h/2), h):
for j in range(0, w):
image[i][j] = 128
from google.colab.patches import cv2_imshow
cv2_imshow(image) # 원본 영상 출력
# 3x3 평균화 마스크 적용
dst = cv2.blur(image, (3, 3))
cv2_imshow(dst) # 결과 영상 출력

- 3x3 마스크: 경계선 부분이 미세하게 부드러워진다.
- 21x21 마스크: 커널 사이즈가 커질수록 평균을 내는 범위가 넓어져 경계선이 훨씬 더 뭉개지고 흐릿해지는(Blurring) 효과가 나타난다.
'영상처리' 카테고리의 다른 글
| Part 7 : 다중 주파수 및 피라미드 선명화 (0) | 2026.02.25 |
|---|---|
| Part 6 : Gabor 및 가우시안 필터 (0) | 2026.02.25 |
| Part 4 : Sigmoid 함수 변환 (0) | 2026.02.25 |
| Part 3 : 영상 이진화와 멱함수 변환 (0) | 2026.02.25 |
| Part 2 : Numpy Indexing을 이용한 영상 생성 (0) | 2026.02.25 |