ホームページ  >  記事  >  バックエンド開発  >  Golang 画像操作: 画像のヒストグラム均等化とグローバルしきい値処理を実行する方法を学びます

Golang 画像操作: 画像のヒストグラム均等化とグローバルしきい値処理を実行する方法を学びます

王林
王林オリジナル
2023-08-18 14:49:52649ブラウズ

Golang 画像操作: 画像のヒストグラム均等化とグローバルしきい値処理を実行する方法を学びます

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. グローバルしきい値処理

グローバルしきい値処理は、シンプルですが効果的な画像の 2 値化方法であり、画像のピクセル値を 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。