파이프라인 아키텍처 개요
노이즈가 포함된 영상의 화질을 개선하기 위해서는 노이즈 수준을 정확히 파악하고, 명암비를 복원한 뒤, 색온도 왜곡을 보정하는 단계적 접근이 필요합니다. 본 가이드에서는 노이즈 분산 추정, 적응형 감마 보정, 그리고 화이트 밸런스 알고리즘을 MATLAB 환경에서 구현하는 기술적 세부 사항을 다룹니다.
핵심 알고리즘 구현
1. 노이즈 분산 추정 (텍스처 기반 필터링)
전체 이미지의 노이즈를 직접 계산하면 엣지 및 텍스처 성분이 노이즈로 오인될 수 있습니다. 이를 방지하기 위해 지역적 기울기(Gradient) 에너지를 분석하여 평탄한 영역(Flat regions)에서만 분산을 추출한 뒤, 중앙값(Median)을 통해 전역 노이즈 수준을 도출합니다.
function noise_var = calc_noise_variance(input_img, patch_dim, edge_limit)
if nargin < 2, patch_dim = 8; end
if nargin < 3, edge_limit = 0.1; end
[rows, cols] = size(input_img);
max_blocks = floor(rows/patch_dim) * floor(cols/patch_dim);
local_vars = zeros(max_blocks, 1);
idx = 1;
% 슬라이딩 윈도우를 이용한 블록 단위 분석
for r = 1:patch_dim:(rows - patch_dim + 1)
for c = 1:patch_dim:(cols - patch_dim + 1)
block = input_img(r:r+patch_dim-1, c:c+patch_dim-1);
% 기울기 벡터를 활용한 텍스처 에너지 산출
[gx, gy] = gradient(double(block));
texture_energy = mean(gx(:).^2 + gy(:).^2);
% 임계값 미만의 평탄한 영역만 노이즈 추정에 반영
if texture_energy < edge_limit
local_vars(idx) = var(block(:));
idx = idx + 1;
end
end
end
% 유효 데이터만 필터링 및 중앙값 계산
local_vars(idx:end) = [];
if isempty(local_vars)
noise_var = 0;
else
noise_var = median(local_vars);
end
end
2. 적응형 감마 보정 (CDF 기반 LUT 매핑)
고정된 감마 값을 적용하는 대신, 영상의 누적 분포 함수(CDF)를 분석하여 목표 명암비에 도달할 수 있는 최적의 감마 계수를 동적으로 산출합니다. 연산 효율을 위해 반복문 대신 벡터화 연산을 통한 룩업 테이블(LUT)을 생성합니다.
function corrected_img = auto_gamma_adjust(src_img, target_cdf)
if nargin < 2, target_cdf = 0.35; end
src_uint8 = im2uint8(src_img);
[pixel_counts, intensity_levels] = imhist(src_uint8);
cumulative_dist = cumsum(pixel_counts) / numel(src_uint8);
% 목표 CDF 값과 가장 근접한 최적 감마 인자 탐색
[~, opt_idx] = min(abs(cumulative_dist - target_cdf));
gamma_val = intensity_levels(opt_idx) / 255;
gamma_val = max(gamma_val, 0.01); % 수학적 오류 방지
% 벡터화 연산을 통한 LUT(Look-Up Table) 구축
lut = uint8(255 * ((0:255)'/255).^gamma_val);
% LUT 매핑 적용 및 데이터 타입 복원
corrected_img = intlut(src_uint8, lut);
corrected_img = im2double(corrected_img);
end
3. 화이트 밸런스 (다중 모드 색온도 보정)
조명 환경에 따른 색상 왜곡을 보정하기 위해 Gray World 가정과 White Patch 추론 두 가지 모드를 지원합니다. 행렬 차원 확장을 위한 reshape 함수를 활용하여 채널별 게인(Gain)을 효율적으로 적용합니다.
function wb_img = apply_white_balance(rgb_img, algorithm)
if nargin < 2, algorithm = 'grayworld'; end
rgb_double = im2double(rgb_img);
switch lower(algorithm)
case 'grayworld'
% Gray World 가정: 전체 채널의 평균을 회색으로 수렴
channel_means = mean(rgb_double, [1, 2]);
ref_mean = channel_means(2); % Green 채널을 레퍼런스로 설정
gains = ref_mean ./ channel_means;
wb_img = rgb_double .* reshape(gains, [1, 1, 3]);
case 'whitepatch'
% White PatchRetinex: 상위 휘도 픽셀을 흰색으로 가정
luminance = rgb2gray(rgb_double);
thresh = prctile(luminance(:), 95);
mask = luminance >= thresh;
r_mean = mean(rgb_double(:,:,1)(mask));
g_mean = mean(rgb_double(:,:,2)(mask));
b_mean = mean(rgb_double(:,:,3)(mask));
max_val = max([r_mean, g_mean, b_mean]);
gains = max_val ./ [r_mean, g_mean, b_mean];
wb_img = rgb_double .* reshape(gains, [1, 1, 3]);
otherwise
error('지원하지 않는 알고리즘 유형입니다.');
end
% 동적 범위 클리핑 (0.0 ~ 1.0)
wb_img = min(max(wb_img, 0), 1);
end
통합 처리 파이프라인
위의 모듈들을 직렬로 연결하여 원본 노이즈 이미지로부터 최종 보정 영상을 도출하고, 객관적 화질 지표를 평가하는 메인 스크립트입니다.
% 1. 타겟 이미지 로드 및 정규화
raw_img = imread('sample_noisy.jpg');
raw_img = im2double(raw_img);
% 2. 노이즈 분산 추정 프로세스
est_var = calc_noise_variance(raw_img, 8, 0.08);
fprintf('추정된 전역 노이즈 분산: %.4f\n', est_var);
% 3. 적응형 감마 보정 수행
gamma_corrected = auto_gamma_adjust(raw_img, 0.45);
% 4. 화이트 밸런스 알고리즘 적용
final_img = apply_white_balance(gamma_corrected, 'whitepatch');
% 5. 시각화 대시보드 구성
figure('Name', '이미지 복원 파이프라인 결과', 'Position', [100, 100, 900, 700]);
subplot(2,2,1); imshow(raw_img); title('원본 노이즈 이미지');
subplot(2,2,2); imshow(gamma_corrected); title('적응형 감마 보정');
subplot(2,2,3); imshow(final_img); title('화이트 밸런스 최종 결과');
% 6. 객관적 화질 지표(PSNR, SSIM) 산출
psnr_val = psnr(raw_img, final_img);
ssim_val = ssim(final_img, raw_img);
fprintf('화질 평가 -> PSNR: %.2f dB | SSIM: %.4f\n', psnr_val, ssim_val);
파라미터 튜닝 가이드
| 파라미터 | 적용 모듈 | 권장 값 | 최적화 가이드 |
|---|---|---|---|
patch_dim |
노이즈 추정 | 8 ~ 16 | 이미지 해상도 및 노이즈 입자 크기에 비례하여 동적 할당 |
edge_limit |
텍스처 필터링 | 0.05 ~ 0.2 | 히스토그램 분석을 통한 배경 영역 에너지 임계값 설정 |
target_cdf |
감마 보정 | 0.3 ~ 0.6 | PSNR(峰值信噪比) 극대화를 기준으로 장면별로 미세 조정 |
algorithm |
화이트 밸런스 | grayworld / whitepatch | 전체적 색조는 grayworld, 국부적 하이라이트가 뚜렷한 경우 whitepatch 권장 |