機械学習のためにバイナリー画像から任意の座標を100個選択し、画像内に指定した座標を種類ごとにプロットしたい
1 view (last 30 days)
Show older comments
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
ー結果ー
上記のようにすべて青色のプロットになってしまいます
長文で大変失礼ですがぜひよろしくお願いします。
0 Comments
Accepted Answer
交感神経優位なあかべぇ
on 12 Jul 2023
ご提示頂いたコードの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
交感神経優位なあかべぇ
on 12 Jul 2023
また、参考までに、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');
More Answers (1)
See Also
Categories
Find more on コンピューター ビジョンと Simulink in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!