画像内の余分なところを除いて新しい行列にしたい
Show older comments
Accepted Answer
More Answers (2)
michio
on 23 Jan 2017
上記の「添字による代入の次元が一致しません。」というエラーですが、
grayscale(:,:,k) = imread(tifFiles(k).name);
の実行において grayscale は 67×67×numfiles の配列ですが、imread で読み取られる画像サイズが 256×256 となっており、配列のサイズが合致していないことが原因です。
for k = 2:numfiles
img = imread(tifFiles(k).name);
grayscale(:,:,k) = img(58:124, 110:176);
end
と配列のサイズを合わせて grayscale に代入してやってください。
また、もし余分なところを取り除いた後に残る中心部分の画像のサイズが事前に分かっていれば、下記の方法が使えるかなと。
5x5の2次元配列から、100である部分を除いて3x2の配列を取り出しているサンプルになります。
% サンプルデータ(周囲が値100で囲まれた 3x2 の画像)
imag1 = 100*ones(5,5);
imag1(2:4,2:3) = rand(3,2)
copy = imag1;
% 100の値を持つ要素を削除
% 中心部分のデータが抽出できますが、すべての要素が
% 一列に並んだベクトルとして(ここでは 1x6 のベクトル)でてきます。
copy(copy==100) = [];
% 一列に並んだデータを2次元に並べ替え (ここで、事前に中心部分の画像サイズが必要)
imag2 = reshape(copy,3,2)
下記を実行して、変数 row や clm などの値を確認してみてください。
また、
copy(:,row) = []; % 要素がすべて1の行を削除
など、= [] で対応する要素を削除することができることを利用します。
% サンプルデータ(周囲が値100で囲まれた 3x2 の画像)
imag1 = 100*ones(5,5);
imag1(2:4,2:3) = rand(3,2)
copy = imag1;
% 100の値を持つ要素位置に1をもった論理配列を作成
idx = copy == 100
row = all(idx,1); % 要素が全て1の行を検出
clm = all(idx,2); % 要素が全て1の列を検出
copy(:,row) = []; % 要素がすべて1の行を削除
copy(clm, :) = [];% 要素がすべて1の列を削除
copy
Categories
Find more on Graphics Performance in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!