[go] Go 언어로 영상 히스토그램 분석 및 수정하기

영상 처리는 컴퓨터 비전 분야에서 중요한 부분입니다. 이번에는 Go 언어를 사용하여 영상의 히스토그램을 분석하고 수정하는 방법에 대해 알아보겠습니다.

1. 영상 히스토그램 분석

영상의 히스토그램은 픽셀 값의 빈도를 보여주는 그래픽 표현입니다. 각 픽셀 값의 빈도를 분석하면 영상의 밝기 분포에 대한 정보를 얻을 수 있습니다. Go 언어에서는 image 패키지를 사용하여 영상을 불러오고 히스토그램을 생성할 수 있습니다.

예를 들어, 다음은 Go 언어를 사용하여 이미지의 히스토그램을 분석하는 간단한 코드입니다:

package main

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

func main() {
	file, err := os.Open("image.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

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

	bounds := img.Bounds()
	width, height := bounds.Max.X, bounds.Max.Y

	histogram := make(map[int]int)
	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			r, _, _, _ := img.At(x, y).RGBA()
			// 히스토그램 업데이트
			histogram[int(r>>8)]++
		}
	}

	fmt.Println(histogram) // 히스토그램 출력
}

이 코드는 image.jpg 파일을 읽어와 픽셀 값의 빈도를 기록한 히스토그램을 출력합니다.

2. 영상 수정

영상의 히스토그램을 분석하여 밝기 분포를 조정하거나 히스토그램 평활화를 통해 영상의 대비를 향상시킬 수 있습니다. Go 언어에서는 image, image/color 패키지를 사용하여 영상을 수정할 수 있습니다.

예를 들어, 다음은 Go 언어를 사용하여 히스토그램 평활화를 적용하는 간단한 코드입니다:

package main

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

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

	histogram := make([]int, 256)
	cdf := make([]float64, 256)

	// 히스토그램 생성
	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			r, _, _, _ := img.At(x, y).RGBA()
			histogram[int(r>>8)]++
		}
	}

	// 누적 분포 함수 생성
	sum := 0.0
	for i, freq := range histogram {
		sum += float64(freq)
		cdf[i] = sum
	}
	for i, _ := range cdf {
		cdf[i] = cdf[i] / float64(width*height) * 255
	}

	// 히스토그램 평활화 적용
	result := image.NewRGBA(bounds)
	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			r, g, b, a := img.At(x, y).RGBA()
			gray := uint8((cdf[int(r>>8)] + cdf[int(g>>8)] + cdf[int(b>>8)]) / 3)
			result.Set(x, y, color.RGBA{gray, gray, gray, uint8(a >> 8)})
		}
	}

	return result
}

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

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

	equalizedImg := equalizeHistogram(img)

	outputFile, err := os.Create("result.jpg")
	if err != nil {
		log.Fatal(err)
	}
	defer outputFile.Close()

	jpeg.Encode(outputFile, equalizedImg, nil)
}

이 코드는 image.jpg 파일을 읽어와 히스토그램 평활화를 적용한 뒤, result.jpg로 저장합니다.

위의 예시를 통해 Go 언어를 이용하여 영상의 히스토그램을 분석하고 수정하는 방법을 간단히 살펴보았습니다. 영상 처리에 대한 추가적인 정보는 Go 언어의 이미지 처리 관련 문서와 예제를 참고해보시기 바랍니다.

참고 문헌