機械学習のために以下の"Isabun"というバイナリー画像から任意の座標を100個選択するプログラムを作りたいです。
2 次查看(过去 30 天)
显示 更早的评论
バイナリー画像のサイズは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 値でなければなりません。
画像処理の研究を始めて少し時間がたっているのですが、現在悪戦苦闘中なのでもしわかる方がいたら教えていただければと思い質問させていただきました。
よろしくお願いいたします。
0 个评论
采纳的回答
Kenjiro Sugimoto
2023-7-10
编辑:Kenjiro Sugimoto
2023-7-11
複数のバグが絡んでおりますので順を追って説明いたします。
まずエラーメッセージの直接的な出処についてです。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 个评论
Akira Agata
2023-7-11
+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')
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 コンピューター ビジョンと Simulink 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!