Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pemprosesan imej Golang: Cara melakukan pengesanan badan cembung dan pemasangan kontur imej

Pemprosesan imej Golang: Cara melakukan pengesanan badan cembung dan pemasangan kontur imej

WBOY
WBOYasal
2023-08-26 12:36:311118semak imbas

Pemprosesan imej Golang: Cara melakukan pengesanan badan cembung dan pemasangan kontur imej

Pemprosesan imej Golang: Cara melakukan pengesanan badan cembung dan pemasangan kontur imej

Abstrak: Pemprosesan imej adalah salah satu hala tuju penyelidikan yang penting dalam bidang penglihatan komputer. Artikel ini akan memperkenalkan cara menggunakan Golang untuk pengesanan badan cembung dan pemasangan kontur imej serta memberikan contoh kod yang berkaitan.

Pengenalan: Pemprosesan imej adalah salah satu aplikasi penting dalam bidang penglihatan komputer. Dalam proses pemprosesan imej, pengesanan badan cembung dan pemasangan kontur adalah operasi yang sangat biasa dan boleh digunakan untuk pengecaman sasaran, pengesanan tepi dan aplikasi lain. Artikel ini akan menumpukan pada cara menggunakan Golang untuk pengesanan badan cembung dan pemasangan kontur imej.

Bahagian Pertama: Pengesanan Convex Hull

Hull convex ialah poligon cembung minimum yang mengandungi semua titik. Dalam pemprosesan imej, kita boleh menggunakan badan cembung untuk mengenal pasti bentuk sasaran dan melakukan operasi seperti kedudukan sasaran dan pembahagian. Berikut ialah contoh kod mudah:

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("凸包检测完成!")
}

Analisis kod:

  1. Mula-mula, kami menggunakan perpustakaan pengimejan untuk memuatkan imej dan mengubah saiz imej kepada saiz yang ditentukan.
  2. Seterusnya, kami menukar imej kepada skala kelabu dan kemudian binarikannya.
  3. Buat kanvas dan lukis imej terdua pada kanvas.
  4. Membina laluan badan cembung dan melintasi setiap piksel imej Jika piksel berwarna hitam, tambahkannya pada laluan badan cembung.
  5. Akhir sekali, lakukan pengesanan badan cembung dan lukis badan cembung, simpan hasilnya sebagai fail imej.

Bahagian 2: Pemasangan Kontur

Pemasangan kontur adalah untuk menyesuaikan tepi sasaran untuk mendapatkan bentuk geometri sasaran. Berikut ialah contoh kod mudah:

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("轮廓拟合完成!")
}

Analisis kod:

  1. Sama seperti pengesanan badan kapal cembung, kami mula-mula memuatkan imej dan mengubah saiznya kepada dimensi yang ditentukan.
  2. Tukar imej kepada skala kelabu dan lakukan penduaan.
  3. Buat kanvas dan lukis imej terdua pada kanvas.
  4. Membina laluan kontur dan melintasi setiap piksel imej Jika piksel berwarna hitam, tambahkannya pada laluan kontur.
  5. Lakukan pemasangan kontur dan lukis hasilnya pada kanvas dan simpan sebagai fail imej.

Kesimpulan:
Artikel ini memperkenalkan cara menggunakan Golang untuk pengesanan badan cembung dan pemasangan kontur imej, dan menyediakan contoh kod yang berkaitan. Pemprosesan imej adalah salah satu aplikasi penting dalam bidang penglihatan komputer Menguasai algoritma asas pemprosesan imej adalah sangat penting untuk memahami dan menggunakan teknologi penglihatan komputer. Saya berharap artikel ini dapat membantu pembaca dalam kajian dan penyelidikan dalam bidang pemprosesan imej.

Atas ialah kandungan terperinci Pemprosesan imej Golang: Cara melakukan pengesanan badan cembung dan pemasangan kontur imej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn