ホームページ  >  記事  >  バックエンド開発  >  Golang 画像処理: 画像を引き伸ばして幾何学的に変換する方法を学びます

Golang 画像処理: 画像を引き伸ばして幾何学的に変換する方法を学びます

PHPz
PHPzオリジナル
2023-08-17 13:01:03643ブラウズ

Golang 画像処理: 画像を引き伸ばして幾何学的に変換する方法を学びます

Golang 画像処理: 画像を引き伸ばして幾何学的に変換する方法を学びましょう

Golang は強力なプログラミング言語として、画像処理における豊富な機能も多数備えています。この記事では、Golang を使用して画像を引き伸ばしたり幾何学的に変換する方法を学びます。

まず、imagegonum.org/v1/plot などの関連パッケージをインポートする必要があります。以下は、画像の読み取り、サイズ変更、保存を行うための簡単なプログラム例です。

package main

import (
    "image"
    "image/color"
    "image/jpeg"
    "image/png"
    "log"
    "math"
    "os"

    "github.com/gonum/matrix/mat64"
)

// 读取图像文件
func loadImage(filename string) (image.Image, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    img, _, err := image.Decode(file)
    return img, err
}

// 保存图像文件
func saveImage(img image.Image, format, filename string) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()
    switch format {
    case "jpeg":
        return jpeg.Encode(file, img, &jpeg.Options{Quality: 100})
    case "png":
        return png.Encode(file, img)
    default:
        return nil
    }
}

// 拉伸图像
func stretchImage(img image.Image, width, height int) image.Image {
    newImg := image.NewRGBA(image.Rect(0, 0, width, height))
    for y := 0; y < height; y++ {
        for x := 0; x < width; x++ {
            srcX := int(float64(x) / float64(width) * float64(img.Bounds().Dx()))
            srcY := int(float64(y) / float64(height) * float64(img.Bounds().Dy()))
            newImg.Set(x, y, img.At(srcX, srcY))
        }
    }
    return newImg
}

// 几何变换
func geometricTransformation(img image.Image, theta float64) image.Image {
    width, height := img.Bounds().Dx(), img.Bounds().Dy()
    cosTheta := math.Cos(theta)
    sinTheta := math.Sin(theta)
    M := mat64.NewDense(3, 3, nil)
    M.Set(0, 0, cosTheta)
    M.Set(0, 1, sinTheta)
    M.Set(0, 2, 0)
    M.Set(1, 0, -sinTheta)
    M.Set(1, 1, cosTheta)
    M.Set(1, 2, 0)
    M.Set(2, 0, 0)
    M.Set(2, 1, 0)
    M.Set(2, 2, 1)
    newImg := image.NewRGBA(image.Rect(0, 0, width, height))
    for y := 0; y < height; y++ {
        for x := 0; x < width; x++ {
            v := mat64.NewVector(3, []float64{float64(x), float64(y), 1})
            res := mat64.NewVector(3, nil)
            res.MulVec(M, v)
            srcX := int(res.At(0, 0) / res.At(2, 0))
            srcY := int(res.At(1, 0) / res.At(2, 0))
            if srcX >= 0 && srcX < width && srcY >= 0 && srcY < height {
                newImg.Set(x, y, img.At(srcX, srcY))
            } else {
                newImg.Set(x, y, color.White)
            }
        }
    }
    return newImg
}

func main() {
    // 读取图像
    img, err := loadImage("input.jpg")
    if err != nil {
        log.Fatal(err)
    }

    // 拉伸图像
    stretchedImg := stretchImage(img, 500, 500)
    err = saveImage(stretchedImg, "jpeg", "stretched.jpg")
    if err != nil {
        log.Fatal(err)
    }

    // 几何变换
    geometricImg := geometricTransformation(img, 0.5)
    err = saveImage(geometricImg, "jpeg", "geometric.jpg")
    if err != nil {
        log.Fatal(err)
    }
}

上記のコードでは、画像ファイルを読み取るための loadImage 関数と、画像ファイルを保存するための saveImage 関数を定義しました。同時に、画像のストレッチと幾何学的変換のための stretchImage 関数と geometricTransformation 関数も定義しました。

main 関数では、最初に input.jpg という名前の画像を読み取ります。次に、stretchImage 関数を呼び出して画像を 500x500 のサイズに引き伸ばし、stretched.jpg ファイルとして保存します。次に、geometricTransformation 関数を呼び出して幾何学的変換を実行し、結果を geometric.jpg ファイルとして保存します。

独自のニーズに応じてコード内のパラメーターと関数を調整して、より詳細な画像処理を実現できます。この記事が、Golang を使用して画像を伸縮したり幾何学的に変換する方法を学ぶのに役立つことを願っています。

以上がGolang 画像処理: 画像を引き伸ばして幾何学的に変換する方法を学びますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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