【入門】グレースケール(Scilab)【数値計算】

【入門】グレースケール(Scilab)【数値計算】 数値計算
【入門】グレースケール(Scilab)【数値計算】

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_ave、犬と自転車、RGB平均、Scilab

dog_gray_sdtv.jpg(SDTV)

dog_gray_sdtv、犬と自転車、SDTV、Scilab

考察

コードとしてはMATLABに似た感じになる。
ただ、MATLABの時のようなfixによる明示的な0方向丸めは行っていない。
Scilabの場合、デフォルトで0方向の丸めになるためである。

SDTVの方の処理で各チャンネルのピクセルの値をdoubleでキャストを行っている。
これもScilabの性質。
uint8でキャストしようとすると、内部の演算もuint8ベースになって、小数点以下の演算が機能しなくなる。
これをdoubleによるキャストによって、小数点以下の計算を促してる。

気を利かしてこのような仕様になっていると思われるが、暗黙的に実施されると演算結果が異なってしまう。
この点は今後も注意が必要。

まとめ

  • ScilabでRGB平均とSDTVのグレースケール化実施。
  • 基本的にはMATLABと似た感じにはなる。
    • デフォルトで0方向へ丸め。
    • 整数型でキャストすると内部の変数も演算前に整数型に変わってしまう。
      • これを抑制するためにdoubleへキャストなどを使用する。

MATLAB、Python、Scilab、Julia比較ページはこちら

コメント

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