2017-11-24 11 views
0

I는 임의의 크기 및 ROWSCOLS의 이미지를 갖는다. 나는 타일로 임의하지만 일정한 보폭 stride = [strideR, strideC] 주어진 임의하지만 일정한 크기 blockSize = [blockSizeR, blockSizeC]의 패치로이 이미지를 원한다. 행 또는 열 방향 시대에 패치의 수는 각각의 블록 크기는 각각 행이나 열,의 수와 일치하지 않는 경우 (예비 행이나 열이 있다면 즉), 내가 그들 (걱정하지 않는다 즉, 그들은 할 수있다 무시 됨). 이미지가 왼쪽 상단 픽셀에서 시작하여 이미지에 완전히 들어 맞는 가능한 모든 패치로 바둑판 식 배열되어 있으면 충분합니다.MATLAB의 임의의 보폭에서 (일정한) 임의의 크기의 패치로 이미지를 어떻게 바꿀 수 있습니까?

웹 주위에 떠 다니는 가능한 솔루션이 있지만 일부는 중복을 허용하지 않으며 일부는 여분의 행이나 열이있는 경우 출력을 허용하지 않으며 일부는 for 루프를 비효율적으로 사용합니다.

%img: source image 
stride = [5, 5];  %height, width 
blocksize = [11, 11]; %height, width 
tilescount = (size(img(:, :, 1)) - blocksize - 1)/stride + 1; 
assert(all(mod(tilescount, 1) == 0), 'cannot divide image into tile evenly') 
tiles = cell(tilescount); 
tileidx = 1; 
for col = 1 : stride(2) : size(img, 2) - blocksize(2) 
    for row = 1 : stride(1) : size(img, 1) - blocksize(1) 
     tiles{tileidx} = img(row:row+stride(1)-1, col:col+stride(2)-1, :); 
     tileidx = tileidx + 1; 
    end 
end 

그러나, 또한 어떤 여분의 행이나 열이없는 경우에만 작동하는 것 같다 :

내가 원하는 것과 가장 가까운 것은 아마도 https://de.mathworks.com/matlabcentral/answers/330357-how-do-i-store-a-series-of-rgb-images-in-a-2d-array에 게시 된 솔루션입니다. 이를 임의의 채널 수 (단일 채널 이미지와 RGB 이미지 모두에 적용하려고 함)가있는 이미지에 대한 효율적인 솔루션에 어떻게 적용 할 수 있습니까?

답변

0

위의 코드는 제대로 작동하지 않았으므로 다음과 같은 해결책을 생각해 냈습니다. 변수 이름은 자명하다.

tilesCountR = floor((ROWS - rowBlockSize - 1)/rowStride + 1); 
tilesCountC = floor((COLS - colBlockSize - 1)/colStride + 1); 

tiles = cell(tilesCountR * tilesCountC,1); 
tileidx = 1; 
for col = 1 : colStride : COLS - colBlockSize 
    for row = 1 : rowStride : ROWS - rowBlockSize 
     tiles{tileidx} = img(row:row+rowBlockSize-1, col:col+colBlockSize-1, :); 
     tileidx = tileidx + 1; 
    end 
end