機械学習のためにバイ​ナリー画像か​ら任意​の座標を100​個選​択し、画像内に指定し​た座標を種類ごとにプ​ロットしたい

5 views (last 30 days)
大誠
大誠 on 12 Jul 2023
Answered: 大誠 on 14 Jul 2023
Isabun,Ibyohen,BWの3つの画像を用いて、上記の画像のように3種類の色に分けて座標として可視化できるようにプロットをしたいです。
プロットしたい画像はIsabunという画像です
100個のランダムで選んだx、y座標と
上記の画像の赤色の部分を1、黄色の部分を0、青色の部分を2とした
100行3列の画像を作成したのですがうまくプロットできません。
ープログラムー
imread(Isabun.png)
imread(Isabun.png)
imread(BW.png)
figure;imshow(Isabun)
%ランダムな配列の作成
y = random('uniform',1,236,10);
Y = y(:);
YY = round(Y)
x = random('uniform',1,392,10);
X = x(:);
XX = round(X)
z = zeros(100,1)
%座標の作成
zahyou = zeros(100,3)
n = 1;
for i = 1:100
%黄色部分の座標を指定
if Isabun(YY(i),XX(i)) == 1
zahyou(n,:) = [XX(i),YY(i),0];
hold on
scatter(XX,YY,"yellow")
hold off
n = n+1;
%赤色部分の座標を指定
else if (0 < Ibyohen(YY(i),XX(i)) )
zahyou(n,:) = [XX(i),YY(i),1]
hold on
scatter(XX,YY,"red")
hold off
n = n+1;
%青色部分の座標を指定
else if BW(YY(i),XX(i)) == 0
zahyou(n,:) = [XX(i),YY(i),2];
hold on
scatter(XX,YY,"blue")
hold off
n = n+1;
end
end
end
end
ー結果ー
上記のようにすべて青色のプロットになってしまいます
長文で大変失礼ですがぜひよろしくお願いします。

Accepted Answer

交感神経優位なあかべぇ
ご提示頂いたコードのscatter(XX,YY,"yellow"), scatter(XX,YY,"red"), scatter(XX,YY,"blue")ですが、XX(i), YY(i)の(i)のインデックスのつけ忘れにより、結果として最後に実行されたscatter(XX,YY,"blue")が最前面に描画されてしまったため、グラフの全データが青色に見えてしまったと思われます。
下記に修正したコードを貼り付けました。
Isabun = imread('https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1432433/Isabun.png');
Ibyohen = imread('https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1432438/Ibyohen.png');
BW = imread('https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1432443/BW.png');
%ランダムな配列の作成
y = random('uniform',1,236,10);
Y = y(:);
YY = round(Y);
x = random('uniform',1,392,10);
X = x(:);
XX = round(X);
for i = 1:100
%黄色部分の座標を指定
if Isabun(YY(i),XX(i)) > 122 % Isabunの値は0 ~ 255のため > 122に変更
hold on
scatter(XX(i),YY(i),"yellow") % (i)の追記
hold off
%赤色部分の座標を指定
else if (0 < Ibyohen(YY(i),XX(i)) )
hold on
scatter(XX(i),YY(i),"red")% (i)の追記
hold off
%青色部分の座標を指定
else if BW(YY(i),XX(i)) == 0
hold on
scatter(XX(i),YY(i),"blue")% (i)の追記
hold off
end
end
end
end
  1 Comment
交感神経優位なあかべぇ
また、参考までに、Isabunの画像ひとつから、色分けデータを描画するサンプルコードを作成しました。
Isabun = imbinarize(imread('https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1432433/Isabun.png'));
colorArea = zeros(size(Isabun),'int32'); % 色領域を示す変数の宣言
colorID = int32(1);
while any(colorArea == 0, 'all') % 塗りつぶしを行っていない領域があった場合
[row, column] = find(colorArea == 0, 1);% 塗りつぶしを行っていない領域をひとつ検索
% 塗りつぶしを行う対象のピクセルがfalseになるように反転する。
if Isabun(row, column)
setImage = ~Isabun;
else
setImage = Isabun;
end
fillImage = imfill(setImage, [row, column]); % 塗りつぶしの実行(要 Image Processing Toolbox)
newFillRange = fillImage ~= setImage; % 塗りつぶしを行った領域のみ抽出
colorArea(newFillRange) = colorID; % 色領域(塗りつぶし部分)に色IDを付与
colorID = colorID + 1;
end
%色の領域を描画
imagesc(colorArea);
colorbar;
% 1 ~ 236の範囲を持つyと1 ~ 392の範囲を持つxのサンプルデータを100個作成
y = rand(100,1);
y = y .* 235 + 1;
x = rand(100,1);
x = x .* 391 + 1;
% colorAreaからサンプルデータの対象となる色IDを抽出
ind = sub2ind(size(colorArea), round(y), round(x));
colorData = colorArea(ind);
% 元画像を薄く表示
c = [0,0,0;1,1,1];
BW = c(uint8(Isabun(:)) + 1, :);
BW = reshape(BW, [size(Isabun), 3]);
image(BW, 'AlphaData', 0.2);
% 色分けした散布図の描画
hold on;
scatter(x,y,[],colorData,'filled');

Sign in to comment.

More Answers (1)

大誠
大誠 on 14 Jul 2023
あかべえ様回答ありがとうございます。
修正していただくだけでなく、別の方法で座標を選択するやり方も教えていただきありがとうございます。
修正していただいたプログラムで動かしてみたら、目的通りに動きました。
二つ目のプログラムも動かしてみたいと思います。
本当にありがとうございました。
。。。返答が遅くなり申し訳ありません。

Community Treasure Hunt

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

Start Hunting!