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_sdtv.jpg(SDTV)
考察
考察
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比較ページはこちら
コメント