2016-07-13 6 views
1

画像の中心座標から単一のパッチを見つけるコードがあります。私はそれを変換したいので、サイズ32X32と16のストライドの複数のパッチを見つけるでしょう。パッチは、画像からでなければならず、境界からも、背景からもではありません。パッチ画像を変換する

centerCoord = [70,125]; 
patchSize = 32; 
patchSourceImage = im(centerCoord(1)-ceil(patchSize/2):centerCoord(1)+ceil(patchSize/2)-1,centerCoord(2)-ceil(patchSize/2):centerCoord(2)+ceil(patchSize/2)-1); 
+0

あなたの 'centerCoord'を、各パッチの中心を格納するマトリックスに変換します。その後、各パッチにコードを適用して保存します(各パッチのサイズは同じです(32 x 32 x Nパッチ)の行列に保存することができます) –

答えて

1

コードのあなたのラインが大きく、それが動作しても、私は、コードをより簡単にお勧めしますので、あなたは、パッチの一部の地域かどうかを確認することができます(のインタレストROIのレジオそれを呼びましょう)が低下画像

例外:ここ

im = rand(150, 150); % 150x150 random "image" 
[nrows, ncols] = size(im); 

% center coordinates of 4 Patches 
centerCoord = [50,50; 100,50; 50,100; 100,100]; 
patchSize = 32; 

% results will be stored in matrix Patches 
Patches = zeros(patchSize, patchSize, size(centerCoord,1)); 

for i=1:size(centerCoord,1) 
    top_left = ceil(centerCoord(i,:) - [patchSize/2, patchSize/2]); 
    bottom_right = top_left + [patchSize-1, patchSize-1]; 

    if any(top_left <= 0) || any((bottom_right - [nrows, ncols]) > 0) 
     %some regions of the patch fall outside the image. Handle this case here. 
    else 
     Patches(:,:,i) = im(top_left(1):bottom_right(1), top_left(2):bottom_right(2)); 
    end 
end 

パッチは、あなたの4つのパッチを含む32x32x4行列です。

+0

似たようなことを試していますが、繰り返し実行してから表示します指数の誤差が行列のディメンションを超える。ループでコードを記述できますか? – decipher

+0

作業の例で回答が更新されました –

+0

私にとっては、パッチの数は最初から定義されていません。私はちょうど私のイメージの中心が[75 125]と言うことを知っています、そして、動的に私はすべてのイメージを通して反復し、中心を更新することによって全体のイメージの32 * 32のパッチを作成します。私が動かすことができる歩幅は16です。 – decipher

-1
im = imread('image98.jpeg'); 
% 150x150 random "image" 
[nrows, ncols] = size(im); 

% center coordinates of 4 Patches 
centerCoord = [75 125]; 
patchSize = 32; 

% results will be stored in matrix Patches 

for r=1:16:nrows 
    for c =1:16:ncols 
    top_left = ceil(centerCoord(1) - [patchSize/2, patchSize/2]); 
    bottom_right = top_left + [patchSize-1, patchSize-1]; 

    if any(top_left <= 0) || any((bottom_right - [nrows, ncols]) > 0) 
     fprint('Outside'); 
    else 
     patch = im(centerCoord(1)-ceil(patchSize/2):centerCoord(1)+ceil(patchSize/2)-1,centerCoord(2)- ceil(patchSize/2):centerCoord(2)+ceil(patchSize/2)-1); 
     imshow(patch) 
     centerCoord(2) =centerCoord(2)+16; 
    end 
     centerCoord(1) =centerCoord(1)+16 
    end 
end 
+0

あなたの画像に複数のチャネルがある場合は、 '[nrows、ncols、nchannels] = size(im);'もforループを使用していますが、 'centerCoord'を意味なく更新しています。あなたは、内側のループの内側と内側の両方で、もう一方の外側ともう一方の外側にある1つの座標を更新しますか?また、ループ変数を使用します。そしてあなたのコードの適切な識別をしてください。 –

+0

センター座標を更新するにはどうすればよいですか?各反復の後に変更する必要がありました。 – decipher

+0

これはあなたがしていないものです。内側のループ内で2つの座標が更新されます。また、画像の中央から開始して、上下に移動したいですか?画像の左上の部分はどうですか? –