Golang 画像処理: 画像を引き伸ばして幾何学的に変換する方法を学びましょう
Golang は強力なプログラミング言語として、画像処理における豊富な機能も多数備えています。この記事では、Golang を使用して画像を引き伸ばしたり幾何学的に変換する方法を学びます。
まず、image
や gonum.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 サイトの他の関連記事を参照してください。