バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/
はじめに
グレースケール化処理を各ツール、各言語で実施。
今回はScilabで実施する。
登場人物
博識フクロウのフクさん
イラスト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
使用する画像
まずは、使用する画像を再掲。
ファイル名はdog.jpgとする。
今回は、Scilabによるグレースケール化の実施
Scilabコード
Scilabコードは以下になる。
function [] = grayscale_test()
// 入力画像の読み込み
img = imread('dog.jpg');
r = img(:,:,1);
g = img(:,:,2);
b = img(:,:,3);
// RGB平均グレースケール
gray_ave = uint8([r/3 + g/3 + b/3 ]);
// グレースケール画像の書き込み
imwrite(gray_ave, 'dog_gray_ave.jpg');
// SDTVグレースケール
gray_sdtv = uint8([0.2990 * double(r) ...
+ 0.5870 * double(g) + 0.1140 * double(b) ]);
// グレースケール画像の書き込み
imwrite(gray_sdtv, 'dog_gray_sdtv.jpg');
endfunction
処理結果
そして処理結果
dog_gray_ave.jpg(RBG平均)
dog_gray_sdtv.jpg(SDTV)
考察
まぁ、コードとしてはMATLABに似た感じかな。
ただ、MATLABの時のようなfixによる0方向丸めってのは無いね。
Scilabの場合、デフォルトで0方向の丸めになる。
あと、SDTVの方の処理で各チャンネルのピクセルの値をdoubleでキャストしてる?
これもScilabの性質だな。
uint8でキャストしようとすると、内部の演算もuint8ベースになって、小数点以下の演算が機能しなくなる。
これをdoubleによるキャストによって、小数点以下の計算を促してるという感じだ。
うーん、気を利かして、そういう仕様になってるのだろうけど、暗黙的にやられちゃうと演算がおかしくなっちゃうのかー。
この点は今後も注意が必要だな。
まとめ
まとめだよ。
- ScilabでRGB平均とSDTVのグレースケール化実施。
- 基本的にはMATLABと似た感じにはなる。
- デフォルトで0方向へ丸め。
- 整数型でキャストすると内部の変数も演算前に整数型に変わってしまう。
- これを抑制するためにdoubleへキャストなどを使用する。
バックナンバーはこちら。
コメント