ホームページ  >  記事  >  バックエンド開発  >  Golang の画像セグメンテーションとコンテンツ認識の方法

Golang の画像セグメンテーションとコンテンツ認識の方法

WBOY
WBOYオリジナル
2023-08-19 14:03:561810ブラウズ

Golang の画像セグメンテーションとコンテンツ認識の方法

画像セグメンテーションとコンテンツ認識を実現する Golang の手法

人工知能とコンピューター ビジョン技術の進歩に伴い、画像セグメンテーションとコンテンツ認識はさまざまな分野で役割を果たしています。ますます重要な役割。この記事では、Golang を使用して画像のセグメンテーションとコンテンツ認識を実現する方法をコード例とともに紹介します。

始める前に、いくつかの必要な Go パッケージをインストールする必要があります。まず、テキスト認識用の Golang ライブラリである「github.com/otiai10/gosseract/v2」をインストールする必要があります。次に、行列演算用の Golang ライブラリである「gonum.org/v1/gonum/mat」もインストールする必要があります。次のコマンドを使用してインストールできます:

go get github.com/otiai10/gosseract/v2
go get -u gonum.org/v1/gonum/...

次に、次の手順を使用して画像のセグメンテーションとコンテンツ認識を実行します。

ステップ 1: 画像を読み取り、グレースケール処理を実行する

まず、ファイルから画像を読み取り、グレースケール画像に変換する必要があります。コード例は次のとおりです。

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/jpeg"
    "os"
)

func main() {
    file, err := os.Open("image.jpg")
    if err != nil {
        fmt.Println("图片读取失败:", err)
        return
    }
    defer file.Close()

    img, err := jpeg.Decode(file)
    if err != nil {
        fmt.Println("图片解码失败:", err)
        return
    }

    gray := image.NewGray(img.Bounds())
    for x := gray.Bounds().Min.X; x < gray.Bounds().Max.X; x++ {
        for y := gray.Bounds().Min.Y; y < gray.Bounds().Max.Y; y++ {
            r, g, b, _ := img.At(x, y).RGBA()
            grayColor := color.Gray{(r + g + b) / 3}
            gray.Set(x, y, grayColor)
        }
    }
}

このコードでは、まず「image.jpg」という名前の画像を開いて読み取ります。次に、「jpeg.Decode」関数を使用して画像を画像オブジェクトにデコードします。次に、新しいグレースケール画像オブジェクト「gray」を作成し、二重ループを使用して元の画像をグレースケールに変換しました。

ステップ 2: 画像をセグメント化する

グレースケール画像を取得した後、いくつかの画像処理アルゴリズムを使用して画像をセグメント化できます。ここでは、しきい値セグメンテーションに OTSU アルゴリズムを使用します。コード例は次のとおりです:

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/jpeg"
    "math"
    "os"
)

func main() {
    // ...

    // 分割图片
    bounds := gray.Bounds()
    threshold := otsu(gray) // OTSU算法获取阈值
    binary := image.NewGray(bounds)
    for x := bounds.Min.X; x < bounds.Max.X; x++ {
        for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
            if gray.GrayAt(x, y).Y > threshold {
                binary.Set(x, y, color.Gray{255})
            } else {
                binary.Set(x, y, color.Gray{0})
            }
        }
    }
}

// OTSU算法计算阈值
func otsu(img *image.Gray) uint32 {
    var hist [256]int
    bounds := img.Bounds()
    for x := bounds.Min.X; x < bounds.Max.X; x++ {
        for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
            hist[img.GrayAt(x, y).Y]++
        }
    }

    total := bounds.Max.X * bounds.Max.Y
    var sum float64
    for i := 0; i < 256; i++ {
        sum += float64(i) * float64(hist[i])
    }
    var sumB float64
    wB := 0
    wF := 0
    var varMax float64
    threshold := 0

    for t := 0; t < 256; t++ {
        wB += hist[t]
        if wB == 0 {
            continue
        }
        wF = total - wB
        if wF == 0 {
            break
        }
        sumB += float64(t) * float64(hist[t])

        mB := sumB / float64(wB)
        mF := (sum - sumB) / float64(wF)

        var between float64 = float64(wB) * float64(wF) * (mB - mF) * (mB - mF)
        if between >= varMax {
            threshold = t
            varMax = between
        }
    }

    return uint32(threshold)
}

このコードでは、OTSU アルゴリズムのしきい値を計算する「otsu」という名前の関数を定義します。次に、この関数を「main」関数で使用して、しきい値を取得します。次に、新しいバイナリ イメージ「binary」を作成し、二重ループを使用してグレースケール イメージをしきい値セグメント化します。

ステップ 3: コンテンツの識別

画像をセグメント化した後、「gosseract」ライブラリを使用して各領域のコンテンツを識別できます。コード例は次のとおりです。

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/jpeg"
    "os"
    "strings"

    "github.com/otiai10/gosseract/v2"
)

func main() {
    // ...

    client := gosseract.NewClient()
    defer client.Close()

    texts := make([]string, 0)
    bounds := binary.Bounds()
    for x := bounds.Min.X; x < bounds.Max.X; x++ {
        for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
            if binary.GrayAt(x, y).Y == 255 {
                continue
            }
            sx := x
            sy := y
            ex := x
            ey := y
            for ; ex < bounds.Max.X && binary.GrayAt(ex, y).Y == 0; ex++ {
            }
            for ; ey < bounds.Max.Y && binary.GrayAt(x, ey).Y == 0; ey++ {
            }
            rect := image.Rect(sx, sy, ex, ey)
            subImg := binary.SubImage(rect)

            pix := subImg.Bounds().Max.X * subImg.Bounds().Max.Y
            blackNum := 0
            for i := subImg.Bounds().Min.X; i < subImg.Bounds().Max.X; i++ {
                for j := subImg.Bounds().Min.Y; j < subImg.Bounds().Max.Y; j++ {
                    if subImg.At(i, j) == color.Gray{255} {
                        blackNum++
                    }
                }
            }
            if float64(blackNum)/float64(pix) < 0.1 { // 去除噪音
                continue
            }

            output, _ := client.ImageToText(subImg)
            output = strings.ReplaceAll(output, "
", "")
            output = strings.ReplaceAll(output, " ", "")
            texts = append(texts, output)
        }
    }

    fmt.Println(texts)
}

このコードでは、「gosseract」ライブラリの「NewClient」関数と「Close」関数を使用して、認識クライアントを作成して閉じます。次に、二重ループを使用して、セグメント化されたバイナリ イメージを反復処理します。白色以外の領域については、その領域の座標範囲を取得し、それをサブ画像に変換します。次に、ノイズを除去するためにサブイメージ内の黒ピクセルの割合を計算します。最後に、「ImageToText」関数を使用してサブイメージをテキストに変換し、結果を「texts」配列に保存します。

上記の手順により、Golang を使用して画像のセグメンテーションとコンテンツ認識を実現する方法が完成しました。独自のニーズに応じてコードを変更および最適化し、さまざまなシナリオやニーズに適応できます。この記事が、画像セグメンテーションとコンテンツ認識テクノロジーを理解して適用するのに少しでも役立つことを願っています。

以上がGolang の画像セグメンテーションとコンテンツ認識の方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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