ホームページ バックエンド開発 Golang Goで画像処理をするにはどうすればよいですか?

Goで画像処理をするにはどうすればよいですか?

May 11, 2023 pm 04:45 PM
プログラミング 言語を移動 画像処理

Go は効率的なプログラミング言語として、画像処理の分野でも優れたパフォーマンスを発揮します。 Go 独自の標準ライブラリは特殊な画像処理関連の API を提供していませんが、GoCV、ImageMagick、GraphicsMagick など、使用できる優れたサードパーティ ライブラリがいくつかあります。この記事では、画像処理に GoCV を使用することに焦点を当てます。

GoCV は、OpenCV に大きく依存する Go 言語バインディング ライブラリです。その API 設計は、Python の opencv-python および C の OpenCV に非常に似ているため、学習と開始が簡単です。画像の処理に使用されます。ビデオ、カメラ、その他のタスク。以下に、一般的に使用されるいくつかの画像処理タスクの実装を紹介します。

  1. 画像の読み込みと保存

画像処理の前に、画像を読み込み、処理された画像を保存する必要があります。 GoCV は、このプロセスの実現に役立つ多くの機能を提供します。以下は、画像の読み込みと保存の例です。

package main

import (
    "fmt"
    "gocv.io/x/gocv"
)

func main() {
    img := gocv.IMRead("test.jpg", gocv.IMReadColor)

    if img.Empty() {
        fmt.Println("读取图像失败")
        return
    }

    gocv.IMWrite("out.jpg", img)
}
ログイン後にコピー

この例では、IMRead 関数を使用して JPG 形式で画像を読み取り、2 番目のパラメータで読み取った画像を指定します。変換方法は必須です。gocv.IMReadColor は、読み取ったイメージをカラー イメージに変換する必要があることを示します。次に、読み取りが成功したかどうかを判断しますが、読み取られた画像が空の場合は、読み取りは失敗します。最後に、IMWrite 関数を使用して、指定した場所に画像を保存します。ここで保存される画像も JPG 形式です。

  1. 画像のスケーリング

画像のスケーリングは、画像処理において非常に一般的なタスクです。画像を縮小すると画像サイズを縮小し、計算を高速化することができ、画像を拡大すると画像の詳細を強調することができます。 GoCV は、画像のスケーリング操作を実装する Resize 関数を提供します。次は、画像をスケーリングする簡単な例です:

package main

import (
    "gocv.io/x/gocv"
)

func main() {
    img := gocv.IMRead("test.jpg", gocv.IMReadColor)
    dst := gocv.NewMat()

    gocv.Resize(img, &dst, image.Point{}, 0.5, 0.5, gocv.InterpolationDefault)

    gocv.IMWrite("out.jpg", dst)
}
ログイン後にコピー

この例では、最初に IMRead## を使用します。関数はイメージを読み取り、NewMat 関数を使用して元のイメージと同じサイズの Mat オブジェクトを作成します。 Resize 関数を使用して元の画像を半分に縮小し、最後に IMWrite を使用して処理された画像を指定された場所に保存します。

    画像のトリミング
画像のトリミングは、画像のローカル処理を実行するために使用でき、関心のある領域の抽出、無駄な情報のトリミングなどにおいて非常に重要な役割を果たすことができます。ターゲットオブジェクトを抽出する重要な役割。 GoCV には、画像トリミング操作を実装する

ROI 関数が用意されています。次は、簡単な画像トリミングの例です:

package main

import (
    "gocv.io/x/gocv"
)

func main() {
    img := gocv.IMRead("test.jpg", gocv.IMReadColor)
    dst := img.Region(gocv.NewRect(50, 50, 200, 200))

    gocv.IMWrite("out.jpg", dst)
}
ログイン後にコピー

この例では、最初に

IMRead## を使用します # 関数は次のように読み取ります画像を取得し、Region 関数を使用して画像から対象領域を抽出します。ここで gocv.NewRect(50, 50, 200, 200) は、切り取られた対象領域が長さ 200 ピクセル、幅 200 ピクセル、左上隅の座標の長方形であることを意味しますは (50, 50) です。最後に、IMWrite を使用して、処理された画像を指定した場所に保存します。

画像フィルタリング
  1. 画像フィルタリングは、画像のノイズを除去したり、画像を滑らかにしたり、その他の操作を行うために使用できます。 GoCV は、
GaussianBlur

MedianBlurBi LateralFilter など、使用できる多くのフィルター関数も提供します。以下はガウス フィルタリングの使用例です。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>package main import ( &quot;gocv.io/x/gocv&quot; ) func main() { img := gocv.IMRead(&quot;test.jpg&quot;, gocv.IMReadGrayScale) dst := gocv.NewMat() gocv.GaussianBlur(img, &amp;dst, image.Point{X: 5, Y: 5}, 0, 0, gocv.BorderDefault) gocv.IMWrite(&quot;out.jpg&quot;, dst) }</pre><div class="contentsignin">ログイン後にコピー</div></div> この例では、

IMRead

関数を使用してグレースケール イメージをロードし、次に NewMat 関数を使用します。元の画像と同じ寸法の Mat オブジェクトを作成します。ここではガウス フィルター関数 GaussianBlur が使用されており、2 番目のパラメーターは出力結果の Mat オブジェクトです。 3 番目のパラメーター image.Point{X: 5, Y:5} は、フィルター処理時に使用されるテンプレート サイズを表します。ここでは、長さ 5 ピクセル、幅 5 ピクセルの長方形です。最後に、IMWrite を使用して、処理された画像を指定した場所に保存します。

画像セグメンテーション
  1. 画像セグメンテーションは重要な画像処理タスクであり、ターゲット オブジェクトの分離や特定の特徴を生成するためのデータの前処理などのタスクに使用できます。 GoCV は、単純な画像セグメンテーションを実装するために使用できる、エッジ検出用の
Canny

関数を提供します。以下は、Canny 関数の使用例です。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>package main import ( &quot;gocv.io/x/gocv&quot; ) func main() { img := gocv.IMRead(&quot;test.jpg&quot;, gocv.IMReadGrayScale) dst := gocv.NewMat() gocv.Canny(img, &amp;dst, 100, 200) gocv.IMWrite(&quot;out.jpg&quot;, dst) }</pre><div class="contentsignin">ログイン後にコピー</div></div> この例では、IMRead<p> 関数を使用してグレースケール イメージをロードし、次に <code>NewMat 関数を使用します。元の画像と同じ寸法の Mat オブジェクトを作成する関数。ここでは Canny エッジ検出関数 Canny が使用されており、2 番目のパラメーターは出力結果の Mat オブジェクトです。 3 番目と 4 番目のパラメータ 100、200 はそれぞれ最小しきい値と最大しきい値を表しており、実際の問題に応じて調整できます。最後に、IMWrite を使用して、処理された画像を指定した場所に保存します。 上記は、いくつかの一般的な画像処理タスクが Go 言語でどのように実装されるかを示しています。 GoCV は優れた画像処理機能を数多く備えており、Python や C 分野の他のライブラリとよく統合されており、導入障壁が低いため、初心者が学習して使用するのに非常に適しています。

以上がGoで画像処理をするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

See all articles