I have an image which I want to divide into overlapping blocks.
I have set the box to be of size 8 rows and 8 columns, and the overlapping factor to be 4 rows/columns.
This is what I have written to solve this:
img = imread('a03-017-05.png');
overlap = 4
count = 1;
for i = 1:overlap:size(img,1)
for j = 1:overlap:size(img,2)
new{count} = img(i:i+8,j:j+8);
count = count+1;
end
end
This works right until it reaches the end of the image where j+8
or i+8
will go beyond the dimensions of the image. Is there any way to avoid this with minimal data loss?
Thanks
Best How To :
If you simply want to ignore the columns/rows that lie outside full sub-blocks, you just subtract the width/height of the sub-block from the corresponding loop ranges:
overlap = 4
blockWidth = 8;
blockHeight = 8;
count = 1;
for i = 1:overlap:size(img,1) - blockHeight + 1
for j = 1:overlap:size(img,2) - blockWidth + 1
...
Let's say your image is 16x16. The block beginning at column 8
will account for the remainder of the columns, so having a starting index between 9 and 16 is pointless.
Also, I think your example miscalculates the block size... you're getting blocks that are 9x9. I think you want to do:
new{count} = img(i:i+blockHeight-1,j:j+blockWidth-1);
As an example, in a 13x13 image with the code above, your row indices will be [1, 5]
and the row ranges of the blocks will be 1:8
and 5:12
. Row/column 13 will be left out.