ホームページ  >  記事  >  バックエンド開発  >  Golang 画像処理: 画像の凸包検出と輪郭フィッティングを実行する方法

Golang 画像処理: 画像の凸包検出と輪郭フィッティングを実行する方法

WBOY
WBOYオリジナル
2023-08-26 12:36:311118ブラウズ

Golang 画像処理: 画像の凸包検出と輪郭フィッティングを実行する方法

Golang 画像処理: 画像の凸包検出と輪郭フィッティングを実行する方法

要約: 画像処理は、コンピューター ビジョンの分野における重要な研究方向の 1 つです。 。この記事では、Golang を使用して凸包検出と画像の輪郭フィッティングを行う方法を紹介し、関連するコード例を示します。

はじめに: 画像処理は、コンピュータ ビジョンの分野における重要なアプリケーションの 1 つです。画像処理プロセスでは、凸包検出と輪郭フィッティングは非常に一般的な操作であり、ターゲット認識、エッジ検出、その他のアプリケーションに使用できます。この記事では、Golang を使用して凸包検出と画像の輪郭フィッティングを行う方法に焦点を当てます。

パート 1: 凸包の検出

凸包は、すべての点を含む最小の凸多角形です。画像処理では、凸包を使用してターゲットの形状を識別し、ターゲットの位置決めやセグメンテーションなどの操作を実行できます。以下は簡単なサンプル コードです:

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/draw"
    "image/jpeg"
    "log"
    "os"

    "github.com/disintegration/imaging"
    "github.com/llgcode/draw2d/draw2dimg"
    "github.com/nfnt/resize"
)

func ConvexHullDetection(inputPath, outputPath string) {
    // 加载图像
    inputImg, err := imaging.Open(inputPath)
    if err != nil {
        log.Fatal(err)
    }

    // 将图像大小调整为指定尺寸
    resizedImg := resize.Resize(800, 0, inputImg, resize.Lanczos3)

    // 将图像转换为灰度图
    grayImg := imaging.Grayscale(resizedImg)

    // 二值化处理
    binaryImg := imaging.AdjustContrast(grayImg, 20)

    // 构建图像的矩形区域
    rectangle := image.Rect(0, 0, binaryImg.Bounds().Size().X, binaryImg.Bounds().Size().Y)

    // 创建画布
    canvas := image.NewRGBA(rectangle)
    draw.Draw(canvas, canvas.Bounds(), binaryImg, image.Point{}, draw.Src)

    // 构建凸包路径
    path := draw2dimg.NewGraphicsPath()

    // 遍历每个像素点
    bounds := binaryImg.Bounds()
    for x := bounds.Min.X; x < bounds.Max.X; x++ {
        for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
            // 获取像素值
            r, _, _, _ := canvas.At(x, y).RGBA()

            // 如果像素为黑色,则添加到凸包路径中
            if r < 65535/2 {
                path.LineTo(float64(x), float64(y))
            }
        }
    }

    // 进行凸包检测
    path.Close()
    hull := path.ConvexHull()

    // 绘制凸包
    context := draw2dimg.NewGraphicContext(canvas)
    context.SetStrokeColor(color.RGBA{R: 255, G: 0, B: 0, A: 255})
    context.SetLineWidth(2)
    for _, point := range hull {
        context.LineTo(float64(point.X), float64(point.Y))
    }
    context.Stroke()

    // 保存图像
    outputFile, err := os.Create(outputPath)
    if err != nil {
        log.Fatal(err)
    }
    defer outputFile.Close()

    err = jpeg.Encode(outputFile, canvas, &jpeg.Options{Quality: 100})
    if err != nil {
        log.Fatal(err)
    }
}

func main() {
    inputPath := "input.jpg"
    outputPath := "output.jpg"
    ConvexHullDetection(inputPath, outputPath)
    fmt.Println("凸包检测完成!")
}

コード分析:

  1. まず、イメージング ライブラリを使用して画像を読み込み、指定されたサイズに画像のサイズを変更します。
  2. 次に、画像をグレースケールに変換してから 2 値化します。
  3. キャンバスを作成し、そのキャンバス上に二値化した画像を描画します。
  4. 凸包パスを構築し、画像の各ピクセルを走査します。ピクセルが黒の場合は、それを凸包パスに追加します。
  5. 最後に、凸包検出を実行して凸包を描画し、結果を画像ファイルとして保存します。

パート 2: 輪郭フィッティング

輪郭フィッティングは、ターゲットの幾何学的形状を取得するためにターゲットのエッジをフィッティングすることです。簡単なコード例を次に示します:

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/draw"
    "image/jpeg"
    "log"
    "os"

    "github.com/disintegration/imaging"
    "github.com/llgcode/draw2d/draw2dimg"
    "github.com/nfnt/resize"
)

func ContourFitting(inputPath, outputPath string) {
    // 加载图像
    inputImg, err := imaging.Open(inputPath)
    if err != nil {
        log.Fatal(err)
    }

    // 将图像大小调整为指定尺寸
    resizedImg := resize.Resize(800, 0, inputImg, resize.Lanczos3)

    // 将图像转换为灰度图
    grayImg := imaging.Grayscale(resizedImg)

    // 二值化处理
    binaryImg := imaging.AdjustContrast(grayImg, 20)

    // 构建图像的矩形区域
    rectangle := image.Rect(0, 0, binaryImg.Bounds().Size().X, binaryImg.Bounds().Size().Y)

    // 创建画布
    canvas := image.NewRGBA(rectangle)
    draw.Draw(canvas, canvas.Bounds(), binaryImg, image.Point{}, draw.Src)

    // 构建轮廓路径
    path := draw2dimg.NewGraphicsPath()

    // 遍历每个像素点
    bounds := binaryImg.Bounds()
    for x := bounds.Min.X; x < bounds.Max.X; x++ {
        for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
            // 获取像素值
            r, _, _, _ := canvas.At(x, y).RGBA()

            // 如果像素为黑色,则添加到轮廓路径中
            if r < 65535/2 {
                path.LineTo(float64(x), float64(y))
            }
        }
    }

    // 进行轮廓拟合
    fitting := path.FitPath(5)

    // 绘制轮廓
    context := draw2dimg.NewGraphicContext(canvas)
    context.SetStrokeColor(color.RGBA{R: 255, G: 0, B: 0, A: 255})
    context.SetLineWidth(2)
    for _, bezier := range fitting {
        context.CubicBezierTo(
            float64(bezier.Control1.X), float64(bezier.Control1.Y),
            float64(bezier.Control2.X), float64(bezier.Control2.Y),
            float64(bezier.To.X), float64(bezier.To.Y))
    }
    context.Stroke()

    // 保存图像
    outputFile, err := os.Create(outputPath)
    if err != nil {
        log.Fatal(err)
    }
    defer outputFile.Close()

    err = jpeg.Encode(outputFile, canvas, &jpeg.Options{Quality: 100})
    if err != nil {
        log.Fatal(err)
    }
}

func main() {
    inputPath := "input.jpg"
    outputPath := "output.jpg"
    ContourFitting(inputPath, outputPath)
    fmt.Println("轮廓拟合完成!")
}

コード分析:

  1. 凸包検出と同様に、最初に画像をロードし、指定された寸法にサイズ変更します。
  2. 画像をグレースケールに変換し、二値化処理を行います。
  3. キャンバスを作成し、そのキャンバス上に二値化した画像を描画します。
  4. 輪郭パスを構築し、画像の各ピクセルを移動します。ピクセルが黒の場合は、輪郭パスに追加します。
  5. 輪郭フィッティングを実行し、結果をキャンバス上に描画し、画像ファイルとして保存します。

結論:
この記事では、Golang を使用して画像の凸包検出と輪郭フィッティングを行う方法を紹介し、関連するコード例を示します。画像処理はコンピュータ ビジョンの分野における重要なアプリケーションの 1 つであり、画像処理の基本アルゴリズムを習得することは、コンピュータ ビジョン テクノロジを理解して応用する上で非常に重要です。この記事が読者の画像処理分野の学習や研究に役立つことを願っています。

以上がGolang 画像処理: 画像の凸包検出と輪郭フィッティングを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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