이미지 노이즈 제거 및 히스토그램 평활화를 통한 이미지 향상

이미지 노이즈 추가

이미지 노이즈는 원치 않는 간섭 신호로, 주요 유형은 다음과 같습니다.

가우시안 노이즈

정규 분포를 따르는 노이즈로, 조명 불량 및 센서 온도 영향으로 발생합니다.

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) 공식 적용
  • 이미지 차분: 배경 노이즈 제거에 효과적
  • 주파수 영역 필터링: 고주파 통과 필터 적용
  • 샤프닝 필터: 라플라시안, 소벨 연산자 사용

태그: 이미지 노이즈 히스토그램 평활화 OpenCV 이미지 향상 중앙값 필터

7월 9일 23:50에 게시됨