ジュリアで画像を読み込み、行列として保存する方法
コード
using Images
cd("C:/Users/rmsms/OneDrive/examples")
pwd()
example = load("example.jpg")
typeof(example)
size(example)
gray1 = Gray.(example)
typeof(gray1)
size(gray1)
M = convert(Array{Float64},gray1)
typeof(M)
size(M)
colorview(Gray, M.^(1/2))
save("rgb.png", colorview(RGB, example))
save("gray1.png", colorview(Gray, gray1))
save("gray2.png", colorview(Gray, transpose(gray1)))
save("gray3.png", colorview(Gray, M.^(1/2)))
上から順にサンプルコードを簡単に理解してみよう:
cd()
: Change Directory, 作業ディレクトリを望む場所に変える。pwd()
: Print Working Directory, 作業ディレクトリを出力する。例をそのまま試したいなら、上のファイルを作業ディレクトリにダウンロードして、ファイル名をexample.jpgに変更しよう。
load()
: 作業ディレクトリ内の画像ファイルを読み込む。読み込まれた画像のタイプはArray{RGB{Normed{UInt8,8}},2}
だ。 これは他の言語でカラー画像を3つの行列を1つのテンソルとして表現するのとは少し違う。実際、そのような方法は数学的には理解しやすいかもしれないが、色空間やライブラリによって統一された規格がなく多くの混乱を招いてきた。Juliaではタイプを1つにして幅と高さが2次元の配列として理解する。画像は読み込まれた瞬間にPlotパネルにプリントされる。Gray()
: 画像を白黒に変換するのに使われた。実際に使われるのはGray()
ではなくGray.()
であることに注意しよう。この関数自体は1つのピクセルを白黒に変えるもので、ドットをつけることで全てのピクセルに適用されることを意味する。size()
: 画像のサイズを返す。述べたように、カラーと白黒を形が違う別のテンソルとして扱わず、データタイプが異なりサイズが同じ配列として扱っている。Convert()
:Array{Float64}
、すなわち行列にgray1画像を変換した。すると、0が黒色で1が白色の行列によって白黒画像が表される。colorview()
: この関数自体が画像や行列を出力する関数だ。わざわざ行列を画像に再変換する必要はなく、直接Plotパネルで画像を確認できる。サンプルコードでは、行列 $M$ の各成分にルートを取っている。行列の全ての成分は $[0,1]$ に属するので、この変換は画像を全体的に明るく補正することに該当する。save()
: 作業ディレクトリに画像を保存する:gray1.png : 白黒で保存された。gray2.png : 白黒であり、転置行列状態で保存された。gray3.png : 白黒であり、明るく補正された状態で保存された。rgb.png : オリジナルの色をそのまま持った状態で保存された。
環境
- OS: Windows
- julia: v1.5.0