Java 환경에서 OpenCV를 사용하면 단 한 줄의 코드로 컬러 이미지를 그레이스케일로 변환하며 읽어 들일 수 있습니다. 핵심은 Imgcodecs 클래스의 imread() 메서드와 적절한 읽기 모드 플래그를 조합하는 것입니다. 이 글에서는 사용 가능한 플래그의 종류와 실제 예제 코드를 통해 그 방법을 자세히 살펴보겠습니다.
imread() 메서드의 기본 동작
Imgcodecs 클래스의 imread() 메서드는 이미지 파일 경로를 나타내는 문자열 값을 매개변수로 받습니다. 이 메서드는 지정된 파일의 내용을 Mat(매트릭스) 객체에 담아 반환하며, 이 객체를 통해 이미지 데이터를 다룰 수 있습니다.
또한 Imgcodecs 클래스는 읽기 모드를 지정하는 정수형 플래그 값을 추가 매개변수로 받는 오버로드된 버전도 제공합니다. 플래그를 활용하면 이미지를 로드하는 동시에 원하는 형식으로 변환할 수 있습니다.
imread()에서 사용할 수 있는 주요 플래그
- IMREAD_COLOR — 이미지를 3채널 BGR(Blue Green Red) 컬러 이미지로 변환하여 로드합니다.
- IMREAD_GRAYSCALE — 이미지를 1채널 그레이스케일 이미지로 변환하여 로드합니다.
- IMREAD_LOAD_GDAL — GDAL 드라이버를 사용하여 이미지를 로드합니다.
- IMREAD_ANYCOLOR — 가능한 모든 컬러 포맷으로 이미지를 읽어 들입니다.
- IMREAD_REDUCED_COLOR_2 / IMREAD_REDUCED_COLOR_4 / IMREAD_REDUCED_COLOR_8 — 이미지를 3채널 BGR로 읽되, 사용한 필드에 따라 원본 크기의 1/2, 1/4 또는 1/8 크기로 축소합니다.
- IMREAD_REDUCED_GRAYSCALE_2 / IMREAD_REDUCED_GRAYSCALE_4 / IMREAD_REDUCED_GRAYSCALE_8 — 이미지를 1채널 그레이스케일로 읽되, 사용한 필드에 따라 원본 크기의 1/2, 1/4 또는 1/8 크기로 축소합니다.
- IMREAD_UNCHANGED — 로드된 이미지를 원본 그대로 반환합니다.
따라서 컬러 이미지를 그레이스케일로 읽고 싶다면 IMREAD_GRAYSCALE 또는 IMREAD_REDUCED_GRAYSCALE_X 계열의 플래그를 매개변수로 전달하면 됩니다.
예제 1: IMREAD_GRAYSCALE로 그레이스케일 변환
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
public class ReadAsGreyScale {
public static void main(String args[]) {
// OpenCV 코어 라이브러리 로딩
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 파일에서 이미지를 그레이스케일로 읽기
Mat matrix = Imgcodecs.imread("D://images//sunset.jpg", Imgcodecs.IMREAD_GRAYSCALE);
// 변환된 이미지 저장
Imgcodecs.imwrite("D://images//sunset_greyscale.jpg", matrix);
System.out.println("Image re-Saved");
}
}
입력 이미지

출력 결과

예제 2: IMREAD_REDUCED_GRAYSCALE_4로 축소 변환
두 번째 예제에서는 IMREAD_REDUCED_GRAYSCALE_4 플래그를 사용합니다. 이 플래그를 지정하면 이미지가 그레이스케일로 변환될 뿐만 아니라, 원본 크기의 1/4로 축소되어 메모리 사용량과 처리 시간까지 절약할 수 있습니다.
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
public class ReadingAsGrey2 {
public static void main(String args[]) {
// OpenCV 코어 라이브러리 로딩
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String input = "D://images//sunset.jpg";
// 파일에서 이미지를 1/4 크기의 그레이스케일로 읽기
Mat matrix = Imgcodecs.imread(input, Imgcodecs.IMREAD_REDUCED_GRAYSCALE_4);
// 변환된 이미지 저장
Imgcodecs.imwrite("D://images//sunset_grey_8.jpg", matrix);
System.out.println("Image re-Saved");
}
}
출력 결과

이처럼 imread() 메서드의 플래그만 잘 활용하면 별도의 색상 변환 과정 없이도 이미지 로드 단계에서 바로 그레이스케일 변환과 크기 축소를 동시에 처리할 수 있습니다. 대량의 이미지를 다루는 프로젝트에서는 REDUCED 계열 플래그를 활용해 성능을 최적화하는 것도 좋은 방법입니다.