背景
MATLABで画像をインポートするとき、例え元画像で背景が透明であっても、その透明部分は黒(RGBがそれぞれ0)としてインポートされてしまいます。
↓MathWorksロゴ(Technical Articles)をpptで背景透過した画像
PCのビューアで見ると背景が透過されていたが、Qiita上だと白になっている…。

↓MATLAB上で imread → imshow した結果

今回は、グラフに画像をプロットする上で、この背景を透過する(任意の色を透過する)方法をご紹介します。
問題設定
axes上に、image関数を使ったオブジェクトとして画像を描画することを考えます。
コード
fig = figure;
ax = axes(fig);
img = imread("sample.png");
obj = image(ax,img);
axis equal
本題
方法としては、下記ページで紹介されている"条件を満たす配列要素の検索"をベースとしています。imreadでインポートした画像配列に対して、RGBを条件としてこの方法を適用し、その検索結果であるインデックスを画像オブジェクトのAlphaDataへ使用するというアイデアです。
RGBを条件として検索をかけるため、まず各色味のRGBを確認します。
用意した画像のRGBはそれぞれ下記の通りです。
| Color | R | G | B |
|---|---|---|---|
| Red | 248 | 63 | 0 |
| Blue | 111 | 129 | 206 |
| Gray | 116 | 116 | 116 |
| Black | 46 | 29 | 27 |
| White | 255 | 255 | 229 |
なんでこんな中途半端な値なんだという点はご容赦ください。
私が好きなゼルダの伝説に登場する色を抜粋しただけで、趣味以上の理由はないです…。
それぞれの色に対して検索条件を設定しましょう。
下記のように記述して、各色を抽出します。
idxMapRed = img(:,:,1) > 245 & img(:,:,2) < 100 & img(:,:,3) < 100;
idxMapBlue = img(:,:,1) < 150 & img(:,:,2) < 150 & img(:,:,3) > 200;
idxMapGray = img(:,:,1) == 116 & img(:,:,2) == 116 & img(:,:,3) == 116;
idxMapBlack = img(:,:,1) < 50 & img(:,:,2) < 50 & img(:,:,3) < 50;
idxMapWhite = img(:,:,1) > 225 & img(:,:,2) > 225 & img(:,:,3) > 225;
補足情報
配列の要素ごとに条件を検索する場合、AND条件の記載には&を使用します。
よくある&&は途中で判定を打ち切る短絡評価と呼ばれるもので、if文のように判定結果がスカラーとなる場合に使用します。
これで、それぞれの色に該当する部分のみが1で、それ以外が0となる論理配列ができました。
あとは、objの透明度を表すプロパティobj.AlphaDataに、これらの論理配列を適用するだけです。
例として、赤色のみ透過させてみましょう。
obj.AlphaData = ~idxMapRed;
意図通りですね。
ちなみに、Notを取って(~をつけて)代入しているのは、AlphaDataの仕様によるものです。
0が透明で、1が不透明というような仕様になっているため、赤色部分のみ0 かつ 赤色以外が1となるような配列にするため、Notを取って0/1を反転させています。
条件式の取り方次第で、いろいろな透過に応用できると思うので、ぜひ試してみてください。
内容としては以上ですが、せっかくなので他の色についても残しておきます。
ご参考までに。
青色
obj.AlphaData = ~idxMapRed;
灰色
obj.AlphaData = ~idxMapGray;
黒色
obj.AlphaData = ~idxMapBlack;
白色
obj.AlphaData = ~idxMapWhite;






