MATLABで恐竜君を抽出してみる
前回は画像処理を行う前に基本的な画像の操作について書いたが、今回はいよいよ画像処理っぽいことをやってみる。目標なくやっていてもダレるので、しばらくは以下の写真を二値化して恐竜君だけを良い感じに抽出することを目標に色々やってみる。
今回はベタに(?)、まず画像をグレースケールに変換して白黒の2値化画像にする処理をMATLABのImage Processing Toolboxの機能を使ってやってみたい。
開発環境
MATLAB online
MATLAB R2022a
Image Processing Toolbox
画像をリサイズする
その前に、前回MATLAB Driveにアップロードした写真はサイズが大きめでちょっと扱いづらいので、画像をリサイズしてから処理することにする。まずは前回やったように画像ファイルdinosaur.jpgを行列Aとして読み込む。
A = imread('dinosaur.jpg');
画像をリサイズするにはimresizeを使えばOK。以下のコマンドを実行すると画像データを入れた行列Aを0.5倍にリサイズしてAsmallという行列として定義している。
Asmall = imresize(A, 0.5);
imresizeのオプションなどは以下を参照。
https://jp.mathworks.com/help/matlab/ref/imresize.html
画像のグレースケール化
RGBの画像をグレースケールに変換する場合はrgb2grayを使う。以下のコマンドでは先ほどリサイズしたAsmallという画像をグレースケールのGという画像に変換している。
G = rgb2gray(Asmall);
imtool(G)を実行してGを表示して見ると、以下のようにグレースケールに変換できていることがわかる。
rgb2grayのオプションなどは以下を参照。
https://jp.mathworks.com/help/matlab/ref/rgb2gray.html
画像の2値化
一口に2値化といっても色々やり方はあるが、まずはMATLABのimbinarizeというコマンドでお手軽にやってみる。methodというオプションをつけることで二値化の方法をglobalとadaptiveで選べるが、何もオプションをつけないとglobalがデフォルトで選択される。
※ちなみに同じような2値化のコマンドとしてim2bwというものもあるが、こちらは現在推奨されていないと公式ドキュメントに書いてあった
BW = imbinarize(G)
こちらが2値化した画像。うーむ、恐竜を抽出するという目的からすると尻尾の周りが消えちゃってるし、ちょっと微妙な感じ。
試しに以下のコマンドでAdaptiveのmethodを選択して試してみた。
BW = imbinarize(G, 'adaptive');
その結果が以下の画像。抽出という意味ではさっきよりは良いかな?
imbinarizeのオプションなどは以下を参照。
https://jp.mathworks.com/help/images/ref/imbinarize.html
ここで恐竜の周りにポツポツ残っている点を消すためにbwareaopenというコマンドを使う。bawareopen以下で150pixel以下の連結したバイナリを削除してみた。
BW2 = bwareaopen(BW, 150);
以下が実行してみた画像。上の方の机の縁のデカい領域は残っている&ところどころ恐竜が消えかかってはいるものの、一応恐竜は抽出できてる感じになった。
bwareaopenのオプションなどは以下を参照。連結要素の定義なども変えられるので、かなり便利。
https://jp.mathworks.com/help/images/ref/bwareaopen.html
ここでふと思ったのだが、恐竜はRGBのG(グリーン)の要素が強そうなので、これをうまく使えばより上手に抽出できそう。ということで、次回は画像をRGB要素ごとに分離して、手動で閾値を設定して二値化してみたいと思う。
参考文献
2.1.3 静止画 画像処理・解析のワークフロー – Qiita
以下の本も適宜参照してます。
MATLAB/Simulink記事まとめ
MATLABとSimulinkの記事は以下にまとめてます。