How can divide image with size 1704 x 2272 into 128 x 128 patches?

2 Ansichten (letzte 30 Tage)
Ismail T. Ahmed
Ismail T. Ahmed am 30 Jan. 2017
Kommentiert: Walter Roberson am 31 Jan. 2017
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 Kommentare
Jan
Jan am 30 Jan. 2017
@Ismail: I've added a proper indentation and removed the blank lines after each line of code to improve the readablility.

Melden Sie sich an, um zu kommentieren.

Antworten (2)

Walter Roberson
Walter Roberson am 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 Kommentare
Image Analyst
Image Analyst am 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
Walter Roberson am 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))

Melden Sie sich an, um zu kommentieren.


Image Analyst
Image Analyst am 30 Jan. 2017
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.

Tags

Noch keine Tags eingegeben.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by