Golang 이미지 작업: 이미지의 히스토그램 평준화 및 전역 임계값 지정을 수행하는 방법을 알아보세요.
소개:
이미지 처리는 컴퓨터 비전 및 이미지 처리 분야에서 중요한 작업 중 하나입니다. 실제 응용 프로그램에서는 이미지 품질을 향상하거나 이미지의 특정 특징을 강조하기 위해 일부 이미지 향상 작업을 수행해야 하는 경우가 많습니다. 이 기사에서는 Golang을 사용하여 이미지 향상을 달성하기 위해 이미지에 대한 히스토그램 균등화 및 전역 임계값 작업을 수행하는 방법을 소개합니다.
1. 히스토그램 평준화
히스토그램 평준화는 일반적으로 사용되는 이미지 향상 방법으로 이미지 픽셀의 회색조 분포를 조정하여 이미지의 대비를 향상시킵니다. 이 방법에서는 먼저 이미지의 누적 히스토그램을 계산한 후, 누적 히스토그램을 기반으로 이미지의 픽셀 값을 조정합니다.
다음은 이미지의 히스토그램 평준화를 구현하기 위한 간단한 Golang 코드 예입니다.
package main import ( "fmt" "image" "image/color" "image/jpeg" "os" ) func main() { // 打开图片文件 file, err := os.Open("input.jpg") if err != nil { fmt.Println(err) return } defer file.Close() // 解码图片 img, _, err := image.Decode(file) if err != nil { fmt.Println(err) return } // 计算直方图 hist := histogram(img) // 计算累积直方图 cumHist := cumulativeHistogram(hist) // 根据累积直方图对图像进行像素值调整 newImg := adjustPixels(img, cumHist) // 保存处理后的图像 outFile, err := os.Create("output.jpg") if err != nil { fmt.Println(err) return } defer outFile.Close() // 编码图像 err = jpeg.Encode(outFile, newImg, &jpeg.Options{Quality: 100}) if err != nil { fmt.Println(err) return } fmt.Println("图像处理完成!") } // 计算直方图 func histogram(img image.Image) []int { bounds := img.Bounds() w, h := bounds.Max.X, bounds.Max.Y hist := make([]int, 256) for y := 0; y < h; y++ { for x := 0; x < w; x++ { r, _, _, _ := img.At(x, y).RGBA() gray := color.Gray{uint8(r / 256)} hist[gray.Y]++ } } return hist } // 计算累积直方图 func cumulativeHistogram(hist []int) []int { cumHist := make([]int, len(hist)) cumHist[0] = hist[0] for i := 1; i < len(hist); i++ { cumHist[i] = cumHist[i-1] + hist[i] } return cumHist } // 根据累积直方图调整像素值 func adjustPixels(img image.Image, cumHist []int) image.Image { bounds := img.Bounds() w, h := bounds.Max.X, bounds.Max.Y newImg := image.NewRGBA(bounds) for y := 0; y < h; y++ { for x := 0; x < w; x++ { r, g, b, a := img.At(x, y).RGBA() gray := color.Gray{uint8(r / 256)} val := uint8(float64(cumHist[gray.Y]) / float64(w*h) * 255) newImg.Set(x, y, color.RGBA{val, val, val, uint8(a / 256)}) } } return newImg }
위 코드에서는 먼저 image
패키지의 Decode
를 전달합니다. 입력 이미지 파일을 image.Image
유형의 객체로 디코딩합니다. 그런 다음 histogram
함수를 호출하여 이미지의 히스토그램을 계산하고 cumulativeHistogram
함수를 호출하여 이미지의 누적 히스토그램을 계산합니다. 마지막으로 누적 히스토그램을 기반으로 이미지의 픽셀 값을 조정하고 jpeg
패키지의 Encode
기능을 사용하여 처리된 이미지를 파일로 저장합니다. image
包的Decode
函数将输入图像文件解码为image.Image
类型的对象。然后,我们分别调用histogram
函数计算图像的直方图,cumulativeHistogram
函数计算图像的累积直方图。最后,我们根据累积直方图调整图像的像素值,并使用jpeg
包的Encode
函数将处理后的图像保存到文件中。
二、全局阈值化
全局阈值化是一种简单但有效的图像二值化方法,它将图像的像素值分为两个互不重叠的光滑区域,分别代表目标物体和背景。这种方法通常应用于具有明显的前景和背景差异的图像。
下面是一个简单的Golang代码示例,用于实现图像的全局阈值化:
package main import ( "fmt" "image" "image/color" "image/jpeg" "os" ) func main() { // 打开图片文件 file, err := os.Open("input.jpg") if err != nil { fmt.Println(err) return } defer file.Close() // 解码图片 img, _, err := image.Decode(file) if err != nil { fmt.Println(err) return } // 根据全局阈值对图像进行二值化处理 newImg := binarize(img) // 保存处理后的图像 outFile, err := os.Create("output.jpg") if err != nil { fmt.Println(err) return } defer outFile.Close() // 编码图像 err = jpeg.Encode(outFile, newImg, &jpeg.Options{Quality: 100}) if err != nil { fmt.Println(err) return } fmt.Println("图像处理完成!") } // 根据全局阈值对图像进行二值化处理 func binarize(img image.Image) image.Image { bounds := img.Bounds() w, h := bounds.Max.X, bounds.Max.Y newImg := image.NewRGBA(bounds) threshold := calculateThreshold(img) for y := 0; y < h; y++ { for x := 0; x < w; x++ { r, g, b, a := img.At(x, y).RGBA() gray := color.Gray{uint8(r / 256)} var val uint8 if gray.Y > threshold { val = 255 } else { val = 0 } newImg.Set(x, y, color.RGBA{val, val, val, uint8(a / 256)}) } } return newImg } // 根据图像的直方图计算全局阈值 func calculateThreshold(img image.Image) uint8 { hist := histogram(img) totalPixels := img.Bounds().Max.X * img.Bounds().Max.Y // 计算背景像素值的总和 var bgSum, bgCount, fgSum, fgCount int for i := 0; i < len(hist); i++ { if i <= 128 { bgSum += i * hist[i] bgCount += hist[i] } else { fgSum += i * hist[i] fgCount += hist[i] } } // 计算背景和前景的平均灰度值 bgMean := bgSum / bgCount fgMean := fgSum / fgCount // 根据背景和前景的平均灰度值计算阈值 return uint8((bgMean + fgMean) / 2) } // 计算直方图 func histogram(img image.Image) []int { bounds := img.Bounds() w, h := bounds.Max.X, bounds.Max.Y hist := make([]int, 256) for y := 0; y < h; y++ { for x := 0; x < w; x++ { r, _, _, _ := img.At(x, y).RGBA() gray := color.Gray{uint8(r / 256)} hist[gray.Y]++ } } return hist }
在上述代码中,我们首先通过image
包的Decode
函数将输入图像文件解码为image.Image
类型的对象。然后,我们调用calculateThreshold
函数计算图像的全局阈值。最后,我们根据全局阈值将图像进行二值化处理,并使用jpeg
包的Encode
전역 임계값은 간단하지만 효과적인 이미지 이진화 방법입니다. 이는 이미지의 픽셀 값을 겹치지 않는 두 개의 부드러운 영역으로 나누어 각각 대상 개체와 배경을 나타냅니다. 이 방법은 일반적으로 전경과 배경의 차이가 뚜렷한 이미지에 적용됩니다.
image
패키지의 Decode
함수를 전달합니다. 이미지 파일을 image.Image
유형의 객체에 입력합니다. 그런 다음 calculateThreshold
함수를 호출하여 이미지의 전역 임계값을 계산합니다. 마지막으로 전역 임계값에 따라 이미지를 이진화하고 jpeg
패키지의 Encode
기능을 사용하여 처리된 이미지를 파일에 저장합니다. 🎜🎜요약: 🎜이 기사에서는 Golang을 사용하여 이미지에 대한 히스토그램 균등화 및 전역 임계값 연산을 수행하는 방법을 소개했습니다. 히스토그램 균등화를 사용하면 이미지의 대비를 개선하여 이미지를 더 명확하고 뚜렷하게 만들 수 있습니다. 전역 임계값을 사용하면 이미지를 이진 이미지로 변환하여 이미지의 대상 개체를 강조할 수 있습니다. 이 두 가지 방법을 유연하게 사용함으로써 다양한 애플리케이션 요구 사항을 충족하는 이미지 향상 및 특징 추출을 달성할 수 있습니다. 실제 응용 분야에서는 다른 이미지 처리 알고리즘을 결합하여 이미지 처리의 효과와 품질을 더욱 향상시킬 수 있습니다. 🎜위 내용은 Golang 이미지 조작: 히스토그램 평준화 및 이미지의 전역 임계값 지정을 수행하는 방법 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!