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("凸包检测完成!") }
コード分析:
パート 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("轮廓拟合完成!") }
コード分析:
結論:
この記事では、Golang を使用して画像の凸包検出と輪郭フィッティングを行う方法を紹介し、関連するコード例を示します。画像処理はコンピュータ ビジョンの分野における重要なアプリケーションの 1 つであり、画像処理の基本アルゴリズムを習得することは、コンピュータ ビジョン テクノロジを理解して応用する上で非常に重要です。この記事が読者の画像処理分野の学習や研究に役立つことを願っています。
以上がGolang 画像処理: 画像の凸包検出と輪郭フィッティングを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。