MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/
はじめに
の、
MATLAB,Python,Scilab,Julia比較 第3章 その13【グレースケール⑤】
を書き直したもの。
グレースケール化処理を各ツール、各言語で実施。
今回はScilabで実施する。
使用する画像
まずは、使用する画像を再掲。
ファイル名は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へキャストなどを使用する。
MATLAB、Python、Scilab、Julia比較ページはこちら
コメント