이미지의 밝기와 대비를 높이거나 낮추는 작업은 이미지의 픽셀 값을 변환하는 연산을 통해 구현할 수 있습니다. 이 변환은 다음과 같은 수식으로 표현됩니다.
g(i, j) = α . f(i, j)+ β
여기서 각 요소의 의미는 다음과 같습니다.
(i, j)는 픽셀의 위치 좌표입니다.
α(gain, 이득)와 β(bias, 편향)는 변환에 사용되는 매개변수입니다.
일반적으로 gain(α) 값은 이미지의 대비를, bias(β) 값은 밝기를 조절하는 역할을 합니다.
org.opencv.core.Mat 클래스의 convertTo() 메서드는 주어진 행렬에 필요한 계산을 수행하여 이미지의 대비와 밝기를 손쉽게 변경할 수 있도록 해줍니다. 이 메서드는 다음과 같은 4개의 매개변수를 받습니다.
m − 결과를 저장할 빈 행렬로, 원본 행렬과 동일한 크기와 타입이어야 합니다.
rtype − 출력 행렬의 타입을 지정하는 정수 값입니다. 음수를 지정하면 원본과 동일한 타입이 적용됩니다.
alpha − gain 값으로, 반드시 0보다 커야 합니다(기본값 1).
beta − bias 값입니다(기본값 0).
OpenCV Java 라이브러리로 이미지 대비 조절하기
앞서 설명했듯이 convertTo() 메서드에 전달되는 alpha 값이 이미지의 대비를 결정합니다. 이 값이 1보다 작으면(0에 가까워질수록) 이미지의 대비가 감소하고, 1보다 크면(최대 255까지) 대비가 증가합니다.
이미지의 대비를 조절하는 전체 절차는 다음과 같습니다.
loadLibrary() 메서드를 사용하여 OpenCV 네이티브 라이브러리를 로드합니다.
imread() 메서드를 사용하여 원하는 이미지 파일을 Mat 객체로 읽어옵니다.
앞 단계에서 얻은 행렬과 동일한 크기와 타입을 가진 빈 행렬을 생성합니다.
convertTo() 메서드에 빈 행렬, -1(동일 타입 유지), 대비를 높이거나 낮출 alpha 값(0~1 또는 1~100 범위), 그리고 beta 값으로 0을 전달하며 호출합니다.
Imgcodecs.imwrite() 메서드를 사용하여 결과 행렬을 출력 이미지 파일로 저장합니다.
예제 코드
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
public class AlteringContrast {
public static void main (String[] args) {
//Loading the OpenCV core library
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
//Reading the Image from the file
String file ="D:\Images\car3.jpg";
Mat src = Imgcodecs.imread(file, Imgcodecs.IMREAD_COLOR);
//Creating an empty matrix
Mat dest = new Mat(src.rows(), src.cols(), src.type());
//Increasing the contrast of the image
src.convertTo(dest, -1, 10, 0);
// Writing the image
Imgcodecs.imwrite("D:\Images\altering_contrast_10.jpg", dest);
}
}입력 이미지

다음은 서로 다른 alpha 값에 따라 얻은 다양한 출력 이미지입니다.
α 값: 0.5
α 값: 0.8

α 값: 1.5
α 값: 2.0
