[go] Go 언어로 영상 히스토그램 평활화 알고리즘 구현하기

영상 처리에서 히스토그램 평활화는 이미지의 대비를 향상시키는 데 사용되는 중요한 기술입니다. 본 포스트에서는 Go 언어를 사용하여 영상의 히스토그램 평활화 알고리즘을 구현하는 방법에 대해 알아보겠습니다.

히스토그램 평활화란?

히스토그램 평활화는 영상의 픽셀 값 분포를 조절하여 대비를 개선하는 과정입니다. 주어진 영상의 히스토그램을 이용하여 각 픽셀 값을 조정함으로써 영상의 시각적인 품질을 향상시킬 수 있습니다.

알고리즘 구현

다음은 Go 언어를 사용하여 히스토그램 평활화 알고리즘을 구현한 예제 코드입니다.

package main

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

func equalizeHistogram(input image.Image) image.Image {
	bounds := input.Bounds()
	width, height := bounds.Max.X, bounds.Max.Y
	totalPixels := float64(width * height)

	// Count pixel intensities
	grayValues := make(map[uint8]float64)
	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			color := color.GrayModel.Convert(input.At(x, y)).(color.Gray)
			grayValues[color.Y]++
		}
	}

	// Calculate equalized pixel intensities
	var sum float64
	var equalizedValues [256]uint8
	for i := 0; i < 256; i++ {
		sum += grayValues[uint8(i)] / totalPixels
		equalizedValues[i] = uint8(255 * sum)
	}

	// Apply equalized values to the image
	output := image.NewGray(bounds)
	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			color := color.GrayModel.Convert(input.At(x, y)).(color.Gray)
			newIntensity := equalizedValues[color.Y]
			output.SetGray(x, y, color.Gray{Y: newIntensity})
		}
	}

	return output
}

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

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

	output := equalizeHistogram(input)

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

	jpeg.Encode(outFile, output, nil)
}

위의 코드는 Go 언어로 구현된 히스토그램 평활화 알고리즘을 보여줍니다. 이 코드는 이미지를 불러와 픽셀 값 분포를 조정한 후, 새로운 이미지를 생성하여 저장합니다.

히스토그램 평활화 알고리즘의 구체적인 동작 방식과 이 코드의 실행 결과는 구현된 이미지에 대한 테스트에서 확인할 수 있습니다.

프로젝트의 전체 코드는 여기에서 확인할 수 있습니다.

히스토그램 평활화 알고리즘은 영상 처리에서 중요한 기법 중 하나이며, Go 언어를 이용하여 이를 구현하는 것은 흥미로운 주제입니다. 해당 알고리즘을 구현하여 영상의 시각적인 품질을 향상시킬 수 있다는 점을 유의하시기 바랍니다.