バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/
はじめに
グレースケール化処理を各ツール、各言語で実施。
今回はMATLABで実施する。
登場人物
博識フクロウのフクさん
イラスト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とする。
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
処理結果
先ほどのMATLABコードの処理結果
dog_gray_ave.jpg(RGB平均)
dog_gray_sdtv.jpg(SDTV)
考察
RGB平均とSDTVの両方のグレースケールを出力してるんだね。
まぁ、元画像のRGBに対しての係数が違うだけでグレースケール化の処理自体は変わらないからね。
確かに、元画像に係数をかけて足してるだけの処理だね。
しかし、uint8とfixの役割がよくわらんな。
まずuint8だが、これはキャストだ。
MATLABの画像データの1チャンネル1ピクセルが8bit長なのでuint8にキャストしている。
そして、fixだが、これは0方向への丸めだ。
0方向への丸め?
MATLABの演算結果は基本的に64bit浮動小数点になる。
これの小数点を切り捨ててる処理だな。
まぁuint8のキャストだけでも小数点以下は四捨五入されるから、それを採用しても良かったが、
他の環境と演算結果を可能な限り合わせるために0方向への丸めにしてある。
なるほど。
演算結果が64bit浮動小数点になる、整数型へのキャストだと小数点以下は四捨五入されるってのがMATLABの特性ってわけか。
それに対して明示的に異なる制御しているのが、uint8とfixってことか。
そうそう。
まとめ
まとめだよ。
- MATLABでRGB平均とSDTVのグレースケール化実施。
- 画像データの型の都合でuint8のキャストが必要。
- unit8キャスト時に小数点以下が自動で四捨五入される。
- 小数点以下切り捨て(0方向への丸め)をしたい場合はfix関数を使用する。
バックナンバーはこちら。
コメント