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

ある画像の中に赤い部分があるのですが、その範囲の座標を知ることができる関数を教えていただきたいです。

 Risposta accettata

Atsushi Ueno
Atsushi Ueno il 26 Giu 2021
Modificato: Atsushi Ueno il 26 Giu 2021

1 voto

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 Commenti

akasa
akasa il 26 Giu 2021
ご回答ありがとうございます。
こちらを参考にしてチャレンジしてみたいと思います。
akasa
akasa il 27 Giu 2021
上記の条件で赤色を探したときに範囲が広くなってしまったため緑と青の条件も絞ろうと考えたのですが、
green=30;
blue=30;
としたとき
[x, y] = ind2sub(size(Rode), find(Rode(:,:,1) >= red) && find(Rode(:,:,2) <=green) && find(Rode(:,:,3) <= blue));
このコードを実行したら、
「論理 AND (&&) と論理 OR (||) 演算子のオペランドは logical スカラー値に変換できなければなりません。」
このエラーコードが出ました。
何か対応策はありますでしょうか?
[x, y] = ind2sub(size(Rode), find(Rode(:,:,1) >= red) && find(Rode(:,:,2) <=green) && find(Rode(:,:,3) <= blue));
の状態ですと、それぞれのfind関数で座標を返しているのでエラーになります。
以下のように論理ANDでindexを絞り込んでfindをかけると解決するかと思います。
clc,clear;
for i = 1:3
A(:,:,i) = randi(100,100);
end
a = 20; b = 30; c =50;
[x,y] = ind2sub(size(A), ...
find((A(:,:,1)>=a & ...
A(:,:,2)>=b & ...
A(:,:,3)>=c)));
size(x),size(y)
ans = 1×2
2922 1
ans = 1×2
2922 1
Atsushi Ueno
Atsushi Ueno il 27 Giu 2021
@Hernia Babyさん、ありがとうございます。コメント回答の通りで、論理演算子が&&でなく&である事がポイントです。
論理 AND (&&) と論理 OR (||) 演算子のオペランドは logical スカラー値に変換できなければなりません。
画像が100*100画素なら(A(:,:,1)>=aは100*100の配列(各画素の判定値)になります。この10000個のTRUE/FALSEを論理AND(&&)は受け付けません。配列の要素毎にそれぞれ演算するのが&演算子です。
ヒント
  • MATLAB® では、記号 & && が異なる演算を実行します。ここで説明する要素単位 AND 演算子は & です。ショートサーキット AND 演算子は && です。
akasa
akasa il 28 Giu 2021
お二方ご回答ありがとうございます。
Herniaさんの例を試してみたいと思います。

Accedi per commentare.

Più risposte (0)

Prodotti

Release

R2021a

Richiesto:

il 26 Giu 2021

Commentato:

il 28 Giu 2021

Community Treasure Hunt

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

Start Hunting!