이미지 노이즈 추가
이미지 노이즈는 원치 않는 간섭 신호로, 주요 유형은 다음과 같습니다.
가우시안 노이즈
정규 분포를 따르는 노이즈로, 조명 불량 및 센서 온도 영향으로 발생합니다.
def add_gaussian_noise(image, mu, std_dev):
"""
이미지에 가우시안 노이즈 추가
입력: image - 원본 이미지, mu - 평균, std_dev - 표준편차
출력: noise_img - 노이즈 처리된 이미지
"""
# [0,1] 범위 정규화
normalized = image.astype(np.float32) / 255.0
# 가우시안 노이즈 생성
noise = np.random.normal(mu, std_dev, normalized.shape)
# 노이즈 적용
noise_img = normalized + noise
# [0,1] 범위 클리핑
noise_img = np.clip(noise_img, 0, 1)
# [0,255] 범위 복원
return (noise_img * 255).astype(np.uint8)
소금-후추 노이즈
흑백 픽셀 점으로 구성되며 노이즈 비율 조절이 가능합니다.
def add_salt_pepper(image, noise_ratio):
"""
소금-후추 노이즈 추가
입력: image - 원본 이미지, noise_ratio - 노이즈 비율
출력: noisy_img - 노이즈 처리된 이미지
"""
height, width = image.shape[:2]
noisy_img = image.copy()
# 노이즈 픽셀 개수 계산
noise_count = int(height * width * noise_ratio)
for _ in range(noise_count):
y = random.randint(0, height-1)
x = random.randint(0, width-1)
# 50% 확률로 흰색/검은색 노이즈 선택
noisy_img[y,x] = 255 if random.random() > 0.5 else 0
return noisy_img
이미지 노이즈 제거
주요 노이즈 제거 기술은 다음과 같습니다.
평균값 필터링
주변 픽셀의 산술 평균으로 대상 픽셀 값을 대체합니다.
def apply_box_filter(image, kernel_size=3):
"""
평균값 필터 적용
입력: image - 원본 이미지, kernel_size - 커널 크기
출력: filtered - 필터링된 이미지
"""
kernel = np.ones((kernel_size, kernel_size)) / (kernel_size**2)
# 컨볼루션 연산 수행
filtered = convolve2d(image, kernel, mode='same', boundary='symm')
return filtered.astype(np.uint8)
중앙값 필터링
주변 픽셀 값의 중앙값으로 대상 픽셀 값을 대체합니다.
def apply_median_filter(image, window=3):
"""
중앙값 필터 적용
입력: image - 원본 이미지, window - 윈도우 크기
출력: result - 필터링된 이미지
"""
offset = window // 2
result = image.copy()
for y in range(offset, image.shape[0]-offset):
for x in range(offset, image.shape[1]-offset):
# 주변 픽셀 추출
region = image[y-offset:y+offset+1, x-offset:x+offset+1]
# 중앙값 계산
result[y,x] = np.median(region)
return result
히스토그램 평활화
이미지 대비 향상을 위한 기술입니다.
그레이스케일 평활화
def custom_hist_equalize(gray_img):
"""
사용자 정의 히스토그램 평활화
입력: gray_img - 그레이스케일 이미지
출력: equalized - 평활화된 이미지
"""
# 히스토그램 계산
hist, _ = np.histogram(gray_img.flatten(), 256, [0,256])
# 누적 분포 함수 계산
cdf = hist.cumsum()
cdf_normalized = (cdf - cdf.min()) * 255 / (cdf.max() - cdf.min())
# LUT 생성
lut = np.uint8(cdf_normalized)
# 픽셀 매핑 적용
return lut[gray_img]
컬러 이미지 평활화
HSV 공간에서 밝기 채널 평활화:
def hsv_equalize_color(img):
"""
HSV 공간에서 컬러 이미지 평활화
입력: img - RGB 컬러 이미지
출력: result - 평활화된 이미지
"""
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
# 밝기 채널 평활화
hsv[:,:,2] = cv2.equalizeHist(hsv[:,:,2])
return cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)
이미지 향상 기법
- 대수 변환: s = c * log(1 + r) 공식 적용
- 이미지 차분: 배경 노이즈 제거에 효과적
- 주파수 영역 필터링: 고주파 통과 필터 적용
- 샤프닝 필터: 라플라시안, 소벨 연산자 사용