機械学習のために以下​の"Isabun"と​いうバイナリー画像か​ら任意の座標を100​個選択するプログラム​を作りたいです。

2 views (last 30 days)
大誠
大誠 on 10 Jul 2023
Commented: 大誠 on 11 Jul 2023
バイナリー画像のサイズは236×392です。
x座標、y座標を決めるベクトルをそれぞれ作って、それらから座標を指定するxyを作り、バイナリー画像のホワイトの部分の座標だけを指定したいです
ー作成したプログラムー
%ランダムな配列の作成
x = random('uniform',1,236,10)
X = x(:);
uiX = uint8(X)
y = random('uniform',1,392,10)
Y = y(:)
uiY = uint8(Y)
xy= uint8(zeros(20,2));
for i = 0:100;
n=1;
if Isabun(i)==1;
xy(n,:)=[XX(i),YY(i)];
n=n+1;
end;
end;
ーエラーメッセージー
配列インデックスは正の整数または logical 値でなければなりません。
画像処理の研究を始めて少し時間がたっているのですが、現在悪戦苦闘中なのでもしわかる方がいたら教えていただければと思い質問させていただきました。
よろしくお願いいたします。

Accepted Answer

Kenjiro Sugimoto
Kenjiro Sugimoto on 10 Jul 2023
Edited: Kenjiro Sugimoto on 11 Jul 2023
複数のバグが絡んでおりますので順を追って説明いたします。
まずエラーメッセージの直接的な出処についてです。MATLABでは添字は1からというルールですが、ご掲示のコードでは i=0:100 のように0スタートになってしまっています。0 は正の整数ではないため、Isabun(i) の行で上記のエラーメッセージが出ております。
次にバグについてです。Isabun は二次元配列ですが、ご掲示のコードでは Isabun(i) のように一つの添字しか与えられておりません。またカウント用変数の初期化 n=1 も、for文の外側(直前)に移動する必要があります。 そのほか、XX,YYが未定義である点もバグかと思われます。
またバグではありませんが修正が望ましい箇所があります。一つは、MATLABでは二次元配列の添え字は y,x の順序ですが、ご掲示のコードでは逆になってしまっています。また for や if の行の最後にセミコロンは不要です(警告が出るかと思います)。
意図を掴めているかは自信がありませんが、上記のバグを解消した参考コードです。
Isabun = imread("Isabun.png");
%ランダムな配列の作成
y = random('uniform',1,236,10);
Y = y(:);
uiY = uint8(Y);
x = random('uniform',1,392,10);
X = x(:);
uiX = uint8(X);
xy = uint8(zeros(20,2));
n = 1;
for i = 1:100
if Isabun(uiY(i),uiX(i)) == 1
xy(n,:) = [X(i),Y(i)];
n = n+1;
end
end
  3 Comments
Akira Agata
Akira Agata on 11 Jul 2023
+1
バイナリ画像の白い部分からランダムに100個の点を選択してその (x,y) 座標を得るのであれば、for ループを使わなくても実現可能です。以下はその一例です。
% 画像を読み込み
Isabun = imread("https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1430498/Isabun.png");
% 念のため2値化
Isabun = imbinarize(Isabun);
% ランダムに選ぶ点の数
N = 100;
% バイナリ画像の白いピクセルの (x,y) 座標すべてを取得
[y, x] = find(Isabun);
% ランダムに100個の点を抽出
pt = randperm(numel(x), N);
x = x(pt);
y = y(pt);
% 可視化して確認
figure
imshow(Isabun)
hold on
scatter(x, y, 'rx')
大誠
大誠 on 11 Jul 2023
Akira Agata 様ありがとうございます。
for文しか頭になかったですが、このような方法でも座標を得られるのですね。
とても勉強になります。
回答していただきありがとうございました。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!