画像内の色を検索する方法

20 ビュー (過去 30 日間)
akasa
akasa 2021 年 6 月 26 日
コメント済み: akasa 2021 年 6 月 28 日
ある画像の中に赤い部分があるのですが、その範囲の座標を知ることができる関数を教えていただきたいです。

採用された回答

Atsushi Ueno
Atsushi Ueno 2021 年 6 月 26 日
編集済み: Atsushi Ueno 2021 年 6 月 26 日
MATLABのfind関数で赤い範囲の座標を知る事が出来ます。
find関数の出力は「赤い画素の配列」なので、max関数やmin関数でその範囲を知る事が出来ます
find関数の出力は線形インデックスなので、これを添え字(X,Y座標)に変換する為ind2sub関数を併用します。
下記コードは具体的な例です
pic = imread('sample.png'); % sample.png(添付ファイル)を読み込む
whos pic % 画像は、100×100×3のuint8配列として読み込まれた
Name Size Bytes Class Attributes pic 100x100x3 30000 uint8
red = 200; % ここでは「"赤い"とはRGBのR成分がuint8(0~255)の200以上」と定義する
[x, y] = ind2sub(size(pic), find(pic(:,:,1) >= red)); % 赤いピクセルを探しx,y座標を得る
size(x) % 赤い点が100ピクセル見つかった。下記はx座標が100個ある事を意味する。y座標も同様
ans = 1×2
100 1
pic(min(x),min(y),:) = 255; % 試しに(最小のx座標, 最小のy座標)に白い点を打ってみる
pic(max(x),max(y),:) = 555; % 試しに(最大のx座標, 最大のy座標)に白い点を打ってみる
imshow(pic);
  5 件のコメント
Atsushi Ueno
Atsushi Ueno 2021 年 6 月 27 日
@Hernia Babyさん、ありがとうございます。コメント回答の通りで、論理演算子が&&でなく&である事がポイントです。
論理 AND (&&) と論理 OR (||) 演算子のオペランドは logical スカラー値に変換できなければなりません。
画像が100*100画素なら(A(:,:,1)>=aは100*100の配列(各画素の判定値)になります。この10000個のTRUE/FALSEを論理AND(&&)は受け付けません。配列の要素毎にそれぞれ演算するのが&演算子です。
ヒント
  • MATLAB® では、記号 & && が異なる演算を実行します。ここで説明する要素単位 AND 演算子は & です。ショートサーキット AND 演算子は && です。
akasa
akasa 2021 年 6 月 28 日
お二方ご回答ありがとうございます。
Herniaさんの例を試してみたいと思います。

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!