[go] go 언어에서의 이미지 히스토그램 분석

이번 포스트에서는 Go 언어를 사용하여 이미지의 히스토그램을 분석하는 방법에 대해 알아보겠습니다. 이미지 히스토그램은 이미지에서 각 픽셀값의 빈도를 보여주는 그래픽 표현입니다. 이미지의 대비, 밝기 및 색상 분포를 이해하는 데 도움이 됩니다.

이미지 불러오기

우선 이미지를 불러오기 위해 Go의 image 라이브러리를 사용할 수 있습니다. 이미지를 불러온 후에는 각 픽셀의 밝기 값을 추출하여 히스토그램을 생성할 수 있습니다.

다음은 이미지를 불러오고 각 픽셀의 밝기 값을 추출하는 예시 코드입니다.

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

func loadImage(filename string) (image.Image, error) {
	file, err := os.Open(filename)
	if err != nil {
		return nil, err
	}
	defer file.Close()

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

히스토그램 생성

이미지를 불러온 후에는 히스토그램을 생성하여 각 픽셀값의 분포를 확인할 수 있습니다. Go 언어에서는 gonum.org/v1/plot 라이브러리를 사용하여 히스토그램을 시각적으로 표현할 수 있습니다.

아래는 이미지의 히스토그램을 생성하는 예시 코드입니다.

import (
	"fmt"
	"image"
	"image/color"

	"gonum.org/v1/plot"
	"gonum.org/v1/plot/plotter"
	"gonum.org/v1/plot/vg"
)

func createHistogram(img image.Image) {
	bounds := img.Bounds()
	width, height := bounds.Max.X, bounds.Max.Y

	hist := make(map[uint8]int)
	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			r, g, b, _ := img.At(x, y).RGBA()
			gray := color.RGBA{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), 255}
			grayVal := gray.Y
			hist[grayVal]++
		}
	}

	p, err := plot.New()
	if err != nil {
		fmt.Println(err)
		return
	}

	values := make(plotter.Values, 256)
	for i := 0; i < 256; i++ {
		values[i] = float64(hist[uint8(i)])
	}

	h, err := plotter.NewBarChart(values, vg.Points(1))
	if err != nil {
		fmt.Println(err)
		return
	}

	p.Add(h)
	p.Save(4*vg.Inch, 4*vg.Inch, "histogram.png")
}

이제 Go를 사용하여 이미지의 히스토그램을 분석하는 방법에 대해 알아보았습니다. 이미지 히스토그램을 통해 이미지의 대비와 분포를 시각적으로 확인할 수 있습니다.

이처럼 이미지 처리를 통해 다양한 분야에서 실용적인 애플리케이션을 개발할 수 있습니다.