【画像処理】Go言語でグレースケール化処理!【サンプルプログラムあり】

golang

こんにちは!zhackです。

先日画像処理に関する記事を掲載し、これに関して、Go言語で二値化処理したプログラムについて紹介しました。

【画像処理】Go言語で二値化処理!【サンプルプログラムあり】
こんにちは!zhackです。 先日、以下の画像処理に関する記事を掲載いたしました。 今回は、それを実際にプログラムで再現してみました。 利用したプログラム言語は、現在勉強中のGo言語です! 画像処理業界ではおなじ...

今回は、グレースケール化処理について説明していきます。

前提

実行環境

今回の実行環境は以下の通りです。

  • Debian GNU/Linux8
    ※Dockerコンテナで環境構築
  • プログラム名称:grayscale.go
  • 入力データ:lena.jpg
  • 実行コマンド
    $ go run プログラム名 < 入力画像のパス > 出力画像のパス 
    今回の場合は
    $ go run grayscale.go < lena.jpg > binary.jpg
  • Gitにも掲載しています。ご参考まで。

Dockerの環境構築や、Go言語の開発環境構築は以下の記事に掲載しています。

DockerでGo言語開発環境構築
Dockerを使ったGo言語の開発環境構築手順を紹介します!簡単に仮想環境を構築できるDockerに、最近サーバサイドの開発で使われつつあるGo言語の開発環境を構築しました。今回はその手順についてご紹介します。
画像付き:Dockerのインストール手順(Windows OS)
zhack(私)が実際に行ったDockerのWindowsOSへのインストール手順です。インストールなしで試してみたい方向けにPlay with Dockerの利用方法も簡単に説明します。

プログラムのひな型

前回同様、実装したプログラムのひな型を紹介します。

package main

// 必要なライブラリのインストール
import (
    "image"
    "image/color"
    "image/jpeg"
    "os"
)
// メイン関数
func main() {

    // 入力データの読み込み
    img, _ := jpeg.Decode(os.Stdin)

    // 入力データを走査するデータの作成
    bounds := img.Bounds()
  // 出力用の入れ物を作成
    dest := image.NewRGBA(bounds)

  // 画像を1ピクセルずつ走査
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            // ピクセルの取得
            curPixel := img.At(x, y)
            // ピクセルから色情報RGBA(16bit)を取得 
            r ,g ,b, a := curPixel.RGBA()
            // 色情報16bitを8bitの形式に変換
            r, g, b, a = r>>8, g>>8, b>>8, a>>8
            
            // (1) 必要な処理
        }
    }

    // 処理結果を画像形式で出力
    err := jpeg.Encode(os.Stdout, dest, nil)
    if err != nil {
        panic("Failed to encode JPEG gradient image.")
    }
}

上記、プログラムにおける“(1) 必要な処理”と書いているところにグレースケール用のコードが入ります。

Go言語のImageパッケージを用いたときの色情報の取得方法については、先日記載した、二値化処理に関する記事をご参考ください。

【画像処理】Go言語で二値化処理!【サンプルプログラムあり】
こんにちは!zhackです。 先日、以下の画像処理に関する記事を掲載いたしました。 今回は、それを実際にプログラムで再現してみました。 利用したプログラム言語は、現在勉強中のGo言語です! 画像処理業界ではおなじ...

Go言語でグレースケール化処理

プログラム

各ピクセルのRGB値の平均をそのまま輝度情報として、画像に割り当ててみました。

RGBそれぞれに同一の値(mean)をいれることで、グレースケール化を実現することができます。

// RGB値から平均を算出
mean := ( r + g + b ) / 3

// 出力する画像として、色を設定
col := color.RGBA{R: uint8(mean), G: uint8(mean), B: uint8(mean), A: uint8(a)}
dest.Set(x, y, col)

 

出力結果

上記のプログラムを実行するとこのようになります。

また、今回はRGB値の平均を用いましたが、その値を調整することで様々なグレースケール画像を出力することができます。

 

さいごに

Go言語で画像処理を行うシリーズ第二弾として、グレースケール化を紹介しました。

結構シンプルな処理で実現できますよね。

意外と画像処理って簡単なんだな、と感じていただければ幸いです。

ではでは!

 

 

コメント

  1. […] […]

タイトルとURLをコピーしました