>  기사  >  백엔드 개발  >  Golang 이미지 처리: 이미지의 볼록 껍질 감지 및 윤곽 피팅을 수행하는 방법

Golang 이미지 처리: 이미지의 볼록 껍질 감지 및 윤곽 피팅을 수행하는 방법

WBOY
WBOY원래의
2023-08-26 12:36:311056검색

Golang 이미지 처리: 이미지의 볼록 껍질 감지 및 윤곽 피팅을 수행하는 방법

Golang 이미지 처리: 이미지의 볼록 껍질 감지 및 윤곽 피팅을 수행하는 방법

요약: 이미지 처리는 컴퓨터 비전 분야의 중요한 연구 방향 중 하나입니다. 이 기사에서는 볼록 껍질 감지 및 이미지 윤곽 피팅에 Golang을 사용하는 방법을 소개하고 관련 코드 예제를 제공합니다.

소개: 이미지 처리는 컴퓨터 비전 분야의 중요한 응용 프로그램 중 하나입니다. 이미지 처리 프로세스에서 볼록 선체 감지 및 윤곽 피팅은 매우 일반적인 작업이며 대상 인식, 가장자리 감지 및 기타 응용 프로그램에 사용될 수 있습니다. 이 기사에서는 볼록 껍질 감지 및 이미지 윤곽 피팅에 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. 다음으로 이미지를 회색조로 변환한 다음 이진화합니다.
  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을 사용하는 방법을 소개하고 관련 코드 예제를 제공합니다. 이미지 처리는 컴퓨터 비전 분야의 중요한 응용 중 하나입니다. 이미지 처리의 기본 알고리즘을 익히는 것은 컴퓨터 비전 기술을 이해하고 적용하는 데 매우 중요합니다. 이 글이 독자들의 이미지 처리 분야 연구와 연구에 도움이 되기를 바랍니다.

위 내용은 Golang 이미지 처리: 이미지의 볼록 껍질 감지 및 윤곽 피팅을 수행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.