画像セグメンテーションとコンテンツ認識を実現する 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/...
次に、次の手順を使用して画像のセグメンテーションとコンテンツ認識を実行します。
まず、ファイルから画像を読み取り、グレースケール画像に変換する必要があります。コード例は次のとおりです。
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」を作成し、二重ループを使用して元の画像をグレースケールに変換しました。
グレースケール画像を取得した後、いくつかの画像処理アルゴリズムを使用して画像をセグメント化できます。ここでは、しきい値セグメンテーションに 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」を作成し、二重ループを使用してグレースケール イメージをしきい値セグメント化します。
画像をセグメント化した後、「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 サイトの他の関連記事を参照してください。