이미지 밝기 조절하기
아래 이미지와 같이 원본이미지의 밝기를 조절하는 방법에 대해서 알아본다.
픽셀 처리하기
이미지를 밝게 하거나 어둡게 하기 위해서는 각 픽셀에 대한 특정 연산을 해줘야한다.
이미지는 여러 픽셀들로 구성되며 픽셀의 총 갯수는 다음과 같이 구할 수 있다.
이미지의 가로 길이 * 이미지의 세로 길이 = 총 픽셀 갯수
일반적인 이미지를 다음과 같이 좌표계를 통해 픽셀의 좌표를 특정해보자.
가로에 해당하는 픽셀을 x축으로 세로에 해당하는 픽셀을 y축으로 나타낸다.
밝기 조절 수식
이미지가 픽셀들의 집합이고 이를 x,y 좌표계로 나타낼 수 있음을 이해했다면 다음 수식을 통해 이미지의 밝기를 조절할 수 있다.
dst(x,y) = saturate(src(x,y)+n)
src : 원본 이미지
dst : 결과 이미지
n : 밝기 조절 상수
원본이미지의 각 픽셀에 n값을 더하여 밝기를 조절한다. n 값이 양의 정수면 이미지는 밝아지고, 음의 정수면 어두워 진다.
saturate연산은 픽셀이 가질 수 있는 값의 범위(0~255)를 넘어서는 경우 0 또는 255로 맞추는 연산이다. 이런 연산을 OpenCV에서 포화연산(saturate)라고 한다.
즉, 어느 픽셀의 값이 250일 때 +10을 더한다고 가정하면 260이므로 255를 초과한 값이 된다. 그럴때는 260을 255로 조절하게 된다.
밝기 조절 함수
사실 이미지의 ‘밝기‘만을 조절하는 함수는 따로 존재하지 않는다.
두 배열(Mat) 또는 배열과 스칼라의 합계를 계산해주는 add()함수를 사용하여 밝기를 조절할 수 있다.
간단한 예제를 살펴보자.
private fun calcBrightness(src: Mat, additionalBrightness: Int): Mat { // 밝기를 스칼라값으로 치환 val src2 = Scalar.all(additionalBrightness.toDouble()) val dst = Mat() Core.add(src, src2, dst) return dst }
첫번째 인자에 원본 이미지를,
두번째 인자에는 더 하고 싶은 밝기정도를 Scalar로 치환하여 넣는다.
세번째 인자에는 결과를 반환받을 Mat 객체를 넣었다.
이외에도 Java OpenCV에는 다음과 같은 인자를 갖는 add 함수를 제공한다.
결과
0개의 댓글