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

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

MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/

はじめに


MATLAB,Python,Scilab,Julia比較 第3章 その11【グレースケール③】

を書き直したもの。

グレースケール化処理を各ツール、各言語で実施。
今回はMATLABで実施する。

使用する画像

今回から実際に各ツール、各言語でグレースケール化の実施になる。
まずは、使用する画像を再掲する。

犬と自転車

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

MATLABコード

MATLABコードは以下になる。

function grayscale_test()
    % 入力画像の読み込み
    img = imread('dog.jpg');
    
    r = img(:,:,1);
    g = img(:,:,2);
    b = img(:,:,3);
    
    % RGB平均グレースケール
    gray_ave = uint8(fix([r/3 + g/3 + b/3 ]));
    % グレースケール画像の書き込み
    imwrite(gray_ave, 'dog_gray_ave.jpg');
    
    % SDTVグレースケール
    gray_sdtv = uint8(fix([0.2990 * r + 0.5870 * g + 0.1140 * b ]));
    % グレースケール画像の書き込み
    imwrite(gray_sdtv, 'dog_gray_sdtv.jpg');
    
end

処理結果

処理結果は以下になる。

dog_gray_ave.jpg(RGB平均)

dog_gray_ave、犬と自転車、RGB平均、MATLAB

dog_gray_sdtv.jpg(SDTV)

dog_gray_sdtv、犬と自転車、SDTV、MATLAB

考察

考察

RGB平均とSDTVの両方のグレースケールを出力している。
元画像のRGBに対しての係数が違うだけでグレースケール化の処理自体は変わらない。
(元画像に係数をかけて足してるだけの処理)

特徴となるのが、uint8とfix。

まずuint8だが、これはキャスト。
MATLABの画像データの1チャンネル1ピクセルが8bit長なのでuint8にキャストしている。

そして、fixだが、これは0方向への丸めを行っている。
MATLABの演算結果は基本的に64bit浮動小数点になる。
これの小数点を切り捨ててる処理になる。
uint8のキャストだけでも小数点以下は四捨五入されるから、それを採用しても良かったが、
他の環境と演算結果を可能な限り合わせるために0方向への丸めにしてある。

演算結果が64bit浮動小数点になる、整数型へのキャストだと小数点以下は四捨五入されるってのがMATLABの特性で、
それに対して、明示的に異なる制御をするためにuint8とfixを使用している。

まとめ

  • MATLABでRGB平均とSDTVのグレースケール化実施。
  • 画像データの型の都合でuint8のキャストが必要。
  • unit8キャスト時に小数点以下が自動で四捨五入される。
    • 小数点以下切り捨て(0方向への丸め)をしたい場合はfix関数を使用する。

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

コメント

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