How can divide image with size 1704 x 2272 into 128 x 128 patches?
2 views (last 30 days)
Show older comments
I have image with size 1704 x 2272. I divide the image into 128 x 128 patches. the output y is cell but the column 18 is empty as attached file. pls can u help me to solve that.
My code is
img = imread(filename)
img = rgb2gray(img);
img = size8cut(img);
y=preprocess5(img);
function Y=size8cut(X) % cut the rim of the image, to make it more fit to be cut into 128*128 patches
[m,n] = size(X);
if mod(m,8)~=0
X=X(1:m-mod(m,8),:);
end
if mod(n,8)~=0
X=X(:,1:n-mod(n,8));
end
Y=X;
end
function blkim=preprocess5(im) % cut the image into image patch with 128*128 size
[m n]=size(im);
i = ceil(m/128);
j = ceil(n/128);
blkim=cell(i,j);
if i-1 ==0 %%no zero dividsion
overlap_m=0;
else
overlap_m=(i*128-m)/(i-1);%compute the overlap between the patches
end
if j-1 ==0
overlap_n=0;
else
overlap_n=(j*128-n)/(j-1);
end
if mod(overlap_m,8)~=0
for count=1:32
m=m-8;
i=ceil(m/128);
overlap_m=(i*128-m)/(i-1);
if mod(overlap_m,8)==0
break;
end
end
end
if mod(overlap_n,8)~=0
for count=1:32
n=n-8;
j=ceil(n/128);
overlap_n=(j*128-n)/(j-1);
if mod(overlap_n,8)==0
break;
end
end
end
im=im(1:m,1:n);
for ii=1:i
for jj=1:j
blkim{ii,jj}=im((128-overlap_m)*(ii-1)+1:(128-overlap_m)*(ii-1)+128,(128-overlap_n)*(jj-1)+1: (128-overlap_n)*(jj-1)+128);
end
end
return;
end
2 Comments
Jan
on 30 Jan 2017
Please read http://www.mathworks.com/matlabcentral/answers/13205-tutorial-how-to-format-your-question-with-markup for instructions to post readable code. Thanks.
Jan
on 30 Jan 2017
@Ismail: I've added a proper indentation and removed the blank lines after each line of code to improve the readablility.
Answers (2)
Walter Roberson
on 30 Jan 2017
Use mat2cell if you do not need overlap. Use blockproc with a function of @(block) {block.data} if you need overlap, and remember to turn off border trim
7 Comments
Image Analyst
on 31 Jan 2017
And why should the image size matter? As long as it will fit a 128x128 tile in there, what's the problem? If you need to handle partial tiles, then see the FAQ, like I've been suggesting, for a more general purpose/flexible solution.
Walter Roberson
on 31 Jan 2017
With no overlap and not assuming complete tiling:
s1 = size(TheImage,1);
s2 = size(TheImage,2);
mat2cell(TheImage, [128 * ones(1, floor(s1/128)), mod(s1,128)], [128 * ones(1, floor(s2/128)), mod(s2,128)], size(TheImage,3))
The expression is a little simpler if you can be sure the images are multiples of 128 on a side:
mat2cell(TheImage, 128 * ones(1, s1/128), 128 * ones(1, s2/128), size(TheImage,3))
Image Analyst
on 30 Jan 2017
See the FAQ for code that works. http://matlab.wikia.com/wiki/FAQ#How_do_I_split_an_image_into_non-overlapping_blocks.3F
It's for non-overlapping blocks. If you need the blocks to overlap instead of being tiled or moving in "jumps" then there is a parameter in blockproc() that can control overlap.
0 Comments
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!