[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 언어를 이용하여 이를 구현하는 것은 흥미로운 주제입니다. 해당 알고리즘을 구현하여 영상의 시각적인 품질을 향상시킬 수 있다는 점을 유의하시기 바랍니다.