Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java OpenCV로 이미지 선명도 조절하는 방법 완벽 정리


이미지 샤프닝(Sharpening)은 블러링(Blurring)과 정반대의 개념으로, 이미지의 윤곽선과 디테일을 더욱 또렷하게 만드는 처리 과정입니다.

OpenCV 라이브러리를 사용해 이미지의 선명도를 변경하려면 언샵 마스킹(Unsharp Masking) 기법을 활용합니다. 이 기법은 다음과 같은 순서로 진행됩니다.

이미지 선명도 변경의 기본 원리

  1. 가우시안 필터 적용: 원본 이미지에 GaussianBlur() 메서드를 사용해 부드럽게(흐리게) 만듭니다.
  2. 차이 계산: 원본 이미지에서 흐려진 이미지를 뺍니다. 이 결과물이 바로 이미지의 세부 디테일(고주파 성분)입니다.
  3. 디테일 추가: 원본 이미지에 추출한 디테일을 가중치를 곱해 다시 더하면 선명도가 강조된 이미지가 완성됩니다.

수식으로 표현하면 다음과 같습니다.

결과 = 원본 × 1.5 − 흐린 이미지 × 0.5

즉, addWeighted() 메서드를 사용해 두 이미지의 가중 합을 계산함으로써 선명도를 조절할 수 있습니다.

예제 코드

아래는 Java OpenCV로 이미지의 선명도를 변경하는 전체 예제 코드입니다.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AlteringSharpness {
    public static void main(String[] args) {
        // OpenCV 네이티브 라이브러리 로드
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        // 파일에서 이미지 읽기
        String file = "D:\\Image\\lamma1.jpg";
        Mat src = Imgcodecs.imread(file, Imgcodecs.IMREAD_COLOR);

        // 빈 매트릭스 생성
        Mat dest = new Mat(src.rows(), src.cols(), src.type());

        // 가우시안 블러 적용 (커널 크기 0, 시그마 10)
        Imgproc.GaussianBlur(src, dest, new Size(0, 0), 10);

        // 원본 1.5배 + 흐린 이미지 -0.5배 → 선명도 강조
        Core.addWeighted(src, 1.5, dest, -0.5, 0, dest);

        // 결과 이미지 저장
        Imgcodecs.imwrite("D:\\Image\\altering_sharpness_100.jpg", dest);
    }
}

코드 주요 단계 설명

  • 라이브러리 로드: System.loadLibrary(Core.NATIVE_LIBRARY_NAME)으로 OpenCV 네이티브 라이브러리를 불러옵니다.
  • 이미지 읽기: Imgcodecs.imread() 메서드로 지정된 경로의 이미지를 컬러(IMREAD_COLOR) 모드로 읽어옵니다.
  • 가우시안 블러: Imgproc.GaussianBlur(src, dest, new Size(0,0), 10)에서 커널 크기를 (0, 0)으로 설정하면 시그마 값(여기서는 10)을 기준으로 자동으로 최적의 커널이 계산됩니다. 시그마 값이 클수록 이미지가 더 많이 흐려집니다.
  • 가중 합 연산: Core.addWeighted(src, 1.5, dest, -0.5, 0, dest)는 원본에 1.5를 곱하고 흐린 이미지에 -0.5를 곱해 더합니다. 이는 원본에서 흐린 이미지의 절반을 뺀 효과와 같으며, 그만큼 디테일이 강조되어 선명해집니다.
  • 결과 저장: Imgcodecs.imwrite() 메서드로 처리된 이미지를 파일로 저장합니다.

선명도 수준 조절하기

addWeighted()의 가중치 값을 변경하면 선명도의 강도를 자유롭게 조절할 수 있습니다.

가중치 조합효과
src: 1.5 / blur: -0.5적당한 선명도 강조
src: 2.0 / blur: -1.0강한 선명도 강조
src: 1.2 / blur: -0.2약간의 선명도 강조

예를 들어, 가중치를 (2.0, -1.0)으로 설정하면 원본 대비 흐린 이미지의 전체가 차감되므로 훨씬 더 날카로운 결과를 얻을 수 있습니다.

입력 이미지

Java OpenCV로 이미지 선명도 조절하는 방법 완벽 정리

출력 결과

Java OpenCV로 이미지 선명도 조절하는 방법 완벽 정리

위 예제처럼 가우시안 블러와 가중 합 연산만으로도 별도의 고급 알고리즘 없이 손쉽게 이미지의 선명도를 조절할 수 있습니다. 사진 보정, 문서 스캔 개선 등 다양한 분야에서 유용하게 활용할 수 있습니다.