이미지 밝기 조절하기

아래 이미지와 같이 원본이미지의 밝기를 조절하는 방법에 대해서 알아본다.

원본이미지

밝기+100

밝기-100

픽셀 처리하기

이미지를 밝게 하거나 어둡게 하기 위해서는 각 픽셀에 대한 특정 연산을 해줘야한다.
이미지는 여러 픽셀들로 구성되며 픽셀의 총 갯수는 다음과 같이 구할 수 있다.

이미지의 가로 길이 * 이미지의 세로 길이 = 총 픽셀 갯수

일반적인 이미지를 다음과 같이 좌표계를 통해 픽셀의 좌표를 특정해보자.

이미지의 각 픽셀을 좌표계로 나타낸다.

가로에 해당하는 픽셀을 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 함수를 제공한다.

결과

 

    Buy me a coffeeBuy me a coffee
    카테고리: AndroidOpenCV

    0개의 댓글

    답글 남기기

    이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.