バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/
はじめに
各ツール、各言語で画像の読み込み、処理、保存の基本的な記載の仕方を確認していく。
今回はJulia。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
使用する画像再掲

今回はJuliaだね。
使用する画像の再掲。

ファイル名はdog.jpgとする。
前準備

Juliaは何かパッケージを追加する必要はあるの?

あるよ。
ImagesとImageViewだな。
以下でパッケージ追加が必要だ。
julia> Pkg.add("Images")
julia> Pkg.add("ImageView")

これも実はOpenCVだったり?

いんや、裏で動いているのはImageMagickというもので、
画像処理に特化したライブラリだな。
というわけで、私の認識の範囲ではカメラキャプチャはできない。
まぁ、別のパッケージを追加することで可能になるかもしれないが、
元々動画は扱わないシリーズなので、Juliaによるカメラキャプチャは無しとする。

まぁ、ついでにできるならやった方が良いとは思ったけど、
そういう感じでもなさそうなんで無しでもいいか。
画像読み込み

まずは画像の読み込み。
事前にusing Imagesをしていることが前提にはなる。
julia> using Images
julia> im = load("dog.jpg");

雰囲気は他の環境と一緒だが、関数名は別物だな・・・。

ここもそうだが、全体的にかなり乖離した仕様になってると思った方が良い。

まじか・・・。
画像表示

画像表示は以下。
julia> using ImageView
julia> imshow(im)


あ、これは他の環境と一緒なのか。

まぁたまたま一緒と思った方がよいな。

ちょいちょい脅してくるな・・・。
画像処理

まずは、赤の成分を抽出。
julia> imc=channelview(im);
julia> imc[2:3,:,:].=0;
julia> im=colorview(RGB, imc);
julia> imshow(im);


channelviewとcolorviewというのが挟まってる???

他の環境では、画像を読み込んだ際に配列として取得されるのだが、
Juliaの場合は構造体的な形で取得される。
それを配列に変換するのが、channelview
その配列を元の構造体に戻すのがcolorviewだな。
配列の状態も他の環境とことなり、
channel,y,xの順番になってる。
他の環境は
y,x,channelなんだけどね。
その違いは
imc[2:3,:,:].=0;
で現れている。

確かに、MATLABとかだと、
im(:,:,(2:3)) = 0;
だったから、色の要素の位置が違うのか!!?

ここはかなり注意が必要だな。

そして、左右反転。
julia> imc=imc[:,:,end:-1:1];
julia> im=colorview(RGB, imc);
julia> imshow(im);


MATLABの時は、
im = im(:,end:-1:1,:);
だったけど、
MATLAB:y,x,channel
Julia:channel,y,x
の影響で反転させる次元が違うのか・・・。

よって、Juliaはいろいろ要注意だな。
画像書き出し

最後は画像の書き出し。
julia> im=colorview(RGB, imc);
julia> save("dog2.jpg",im);

そうか。
colorviewで構造体に戻さないと書き出しができないのか。

これはimshowによる表示の時も一緒だ。
先ほどは、loadしたものをそのままimshowしたのでcolorviewの出番はなかったが、
実際はimshowの直前でcolorviewを使用することになるはずだ。

絶対に忘れてエラーまみれを食らうパターンだ!

そう。まさにそんな感じだったよ・・・。

(動作確認の時に散々な目にあったんだな・・・。)
まとめ

まとめだよ。
- Juliaで画像処理。
- ImagesとImageViewのパッケージをインストール。
- OpenCVではなくImageMagickを使用したパッケージなので他の環境と性格が異なる。
- ImagesのAPIとやり取りする場合は基本構造体ベースだが、処理をする際は配列にするなど行ったり来たりが発生する。
バックナンバーはこちら。
コメント