[go] go 언어에서의 이미지 대조도 조절

이미지 처리 과정에서 대조도(Contrast)는 이미지의 밝기 차이를 나타냅니다. 대조도를 조절하여 이미지를 더 선명하게 하거나 시각적인 효과를 부여할 수 있습니다. Go 언어에서는 image 패키지를 사용하여 이미지를 읽고 처리할 수 있습니다. 이 글에서는 Go 언어를 사용하여 이미지의 대조도를 조절하는 방법을 살펴보겠습니다.

이미지 읽기

먼저, 이미지를 읽어야 합니다. Go 언어에서는 image 패키지의 Decode 함수를 사용하여 이미지 파일을 디코딩할 수 있습니다. 아래는 JPEG 이미지를 읽는 예제 코드입니다.

package main

import (
	"image"
	_ "image/jpeg"
	"os"
)

func main() {
	file, err := os.Open("input.jpg")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	img, _, err := image.Decode(file)
	if err != nil {
		panic(err)
	}
}

위의 코드에서 image.Decode 함수를 사용하여 input.jpg 파일을 읽고, img 변수에 이미지를 저장합니다.

대조도 조절

이제 이미지의 대조도를 조절해보겠습니다. Go 언어에서는 이미지의 각 픽셀을 조작하여 대조도를 조절할 수 있습니다. 대조도를 조절하는 가장 간단한 방법은 이미지의 모든 픽셀 값에 상수를 더하거나 빼는 것입니다. 아래는 대조도를 조절하는 예제 코드입니다.

package main

import (
	"image"
	"image/color"
	_ "image/jpeg"
	"os"
)

func main() {
	file, err := os.Open("input.jpg")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	img, _, err := image.Decode(file)
	if err != nil {
		panic(err)
	}

	contrast := 50
	bounds := img.Bounds()
	for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
		for x := bounds.Min.X; x < bounds.Max.X; x++ {
			oldPixel := img.At(x, y)
			r, g, b, a := oldPixel.RGBA()
			newR := uint32(clamp(int(r) + contrast))
			newG := uint32(clamp(int(g) + contrast))
			newB := uint32(clamp(int(b) + contrast))
			newPixel := color.RGBA64{newR, newG, newB, uint16(a)}
			img.Set(x, y, newPixel)
		}
	}
}

위의 코드에서는 contrast 변수를 사용하여 대조도를 조절하였습니다. 각 픽셀의 RGB 값을 contrast만큼 조절하여 새로운 이미지를 생성합니다. 이때 clamp 함수는 값이 0 미만이거나 65535를 초과하는 경우를 대비하여 값을 조정합니다.

처리된 이미지 저장

대조도를 조절한 이미지를 저장하는 방법은 다음과 같습니다.

output, err := os.Create("output.jpg")
if err != nil {
    panic(err)
}
defer output.Close()

jpeg.Encode(output, img, nil)

위의 예제 코드에서는 jpeg.Encode 함수를 사용하여 이미지를 JPEG 파일로 저장합니다.

이제 위의 예제 코드를 참고하여 Go 언어에서 이미지의 대조도를 조절하는 방법을 익히고 개별 프로젝트에 적용해보세요.

참고 자료