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
関数を使用して、処理された画像をファイルに保存します。 2. グローバルしきい値処理
以下は、画像のグローバルしきい値処理のための簡単な 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 関数を呼び出して、画像のグローバルしきい値を計算します。最後に、グローバルしきい値に基づいて画像を 2 値化し、
jpeg パッケージの
Encode 関数を使用して、処理された画像をファイルに保存します。
概要:
この記事では、Golang を使用して画像に対してヒストグラム イコライゼーションとグローバルしきい値処理を実行する方法を紹介します。ヒストグラム等化を使用すると、画像のコントラストを向上させ、画像をより鮮明で鮮明にすることができます。また、グローバルしきい値処理を使用して画像をバイナリ イメージに変換し、画像内のターゲット オブジェクトを強調表示することができます。この 2 つの手法を柔軟に使い分けることで、さまざまなアプリケーションのニーズに合わせた画像補正と特徴抽出を実現します。実際のアプリケーションでは、他の画像処理アルゴリズムを組み合わせて、画像処理の効果と品質をさらに向上させることができます。
以上がGolang 画像操作: 画像のヒストグラム均等化とグローバルしきい値処理を実行する方法を学びますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。