在 MATLAB 中将图像划分为子图像时删除了部分图像
Part of an image removed when dividing an image into sub images in MATLAB
我有一张336*104像素的图片,需要将其分成35*35的子图。但是 336 和 104 不能被 35 整除,因此当我分割它时图像的一部分被删除了。我得到了一个没有非 35*35 像素部分的重新组合图像。我无法调整它的大小,因为如果我这样做,图像会非常不同。这是我的代码:
% Size of the image
[H W] = size(im);
% Each sub image has 35*35 pixels
size_sub_image = 35;
% Size of each sub image
H_divided = H/size_sub_image;
W_divided = W/size_sub_image;
% Reminders allowing to take the images which are not divided
R_H = rem(H,size_sub_image);
R_W = rem(W,size_sub_image);
%Variable which is incremented and stand for each sub image
nbr_sub_images = 1;
% Division of the image into sub images
for i = 1:floor(H_divided)
for j = 1:floor(W_divided)
% R_H and R_W allow to create the sub images reminding, which have not
%35*35 pixels.
%My idea was that when each i or j reach the max in the loop, the
%algorithm take the remindind images which have the size of R_H or R_W.
% R_H = 21 (336 = 35*9+21) and R_W = 34 (104 = 35*2+34)
if (i ~= floor(H_divided) && j ~= floor(W_divided))
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );
end
if (i == floor(H_divided))
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*i+1:size_sub_image*i + R_H,size_sub_image*(j-1)+1:size_sub_image*j);
end
if (j == floor(W_divided))
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i,size_sub_image*j+1:size_sub_image*j + R_W);
end
end
end
当我执行它时,出现错误:"Subscripted assignment dimension mismatch",但我不明白为什么,因为当我删除 R_H
和 R_W
时,代码运行良好。
据我了解,您正试图将不同大小的子图像放入一个 3-D 数组中,这是行不通的。当您将二维图像添加到数组 im_divided
时,所有子图像的第一维和第二维必须相同(即 35x35)。有关详细信息,请参阅 MATLAB documentation.
有 2 种可能的解决方案:要么填充图像的边缘(用零或其他值)以便宽度和高度可以被 35 整除,要么使用元胞数组来存储子图像:
im_divided{nbr_sub_images} = im(rows, columns)
元胞数组能够存储不同大小的矩阵(或者实际上是各种不同的对象)。
我有一张336*104像素的图片,需要将其分成35*35的子图。但是 336 和 104 不能被 35 整除,因此当我分割它时图像的一部分被删除了。我得到了一个没有非 35*35 像素部分的重新组合图像。我无法调整它的大小,因为如果我这样做,图像会非常不同。这是我的代码:
% Size of the image
[H W] = size(im);
% Each sub image has 35*35 pixels
size_sub_image = 35;
% Size of each sub image
H_divided = H/size_sub_image;
W_divided = W/size_sub_image;
% Reminders allowing to take the images which are not divided
R_H = rem(H,size_sub_image);
R_W = rem(W,size_sub_image);
%Variable which is incremented and stand for each sub image
nbr_sub_images = 1;
% Division of the image into sub images
for i = 1:floor(H_divided)
for j = 1:floor(W_divided)
% R_H and R_W allow to create the sub images reminding, which have not
%35*35 pixels.
%My idea was that when each i or j reach the max in the loop, the
%algorithm take the remindind images which have the size of R_H or R_W.
% R_H = 21 (336 = 35*9+21) and R_W = 34 (104 = 35*2+34)
if (i ~= floor(H_divided) && j ~= floor(W_divided))
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );
end
if (i == floor(H_divided))
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*i+1:size_sub_image*i + R_H,size_sub_image*(j-1)+1:size_sub_image*j);
end
if (j == floor(W_divided))
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i ,size_sub_image*(j-1)+1:size_sub_image*j );
nbr_sub_images = nbr_sub_images + 1;
im_divided(:,:,nbr_sub_images) = im(size_sub_image*(i-1)+1:size_sub_image*i,size_sub_image*j+1:size_sub_image*j + R_W);
end
end
end
当我执行它时,出现错误:"Subscripted assignment dimension mismatch",但我不明白为什么,因为当我删除 R_H
和 R_W
时,代码运行良好。
据我了解,您正试图将不同大小的子图像放入一个 3-D 数组中,这是行不通的。当您将二维图像添加到数组 im_divided
时,所有子图像的第一维和第二维必须相同(即 35x35)。有关详细信息,请参阅 MATLAB documentation.
有 2 种可能的解决方案:要么填充图像的边缘(用零或其他值)以便宽度和高度可以被 35 整除,要么使用元胞数组来存储子图像:
im_divided{nbr_sub_images} = im(rows, columns)
元胞数组能够存储不同大小的矩阵(或者实际上是各种不同的对象)。