如何从图像中裁剪多个随机批次?

时间:2016-02-15 14:42:44

标签: image matlab

我有一个大小(224 x 224)的图像,我想使用Matlab从原始图像中提取一些随机补丁(比如5个补丁)。其中一个补丁应该位于原始图像的中心。补丁大小为(128 x 128)。

我试过这个只裁剪中心补丁:

II = imread('img.png')
[p3, p4] = size(II);
q1 = 50; // size of the crop box
i3_start = floor((p3-q1)/2); % or round instead of floor; using neither gives warning
i3_stop = i3_start + q1;

i4_start = floor((p4-q1)/2);
i4_stop = i4_start + q1;

II = II(i3_start:i3_stop, i4_start:i4_stop, :);
figure ,imshow(II);

2 个答案:

答案 0 :(得分:2)

我试图通过以下方式实现这一目标:

A=imread('Lena.bmp');%sample image
rnd_x = randperm(size(A,1)-128,5);%choose 5 tandom unique points on x-axis
rnd_y = randperm(size(A,2)-128,5);%choose 5 tandom unique points on y-axis
for ii = 1:5
    piece{ii} = A((rnd_x(ii):(rnd_x(ii)+127)),(rnd_y(ii):(rnd_y(ii)+127)),1:3);%Convert chosen numbers to image pieces
    figure(ii)
    imshow(piece{ii});
end

这需要像这样的图像: enter image description here

这给出了5张这样的照片:

enter image description here

此处我们的图片尺寸为512x512。因此,如果我们想要从中切割128x128,我们需要寻找385x385网格(512-127)。我们在rnd_xrnd_y表示网格上找到5个随机点。最后,我们将找到的点作为片段的左上角,并从中构建128x128图像。 5个片段以片状单元阵列记录。

编辑:忘了添加如何提取中心补丁。以下代码执行任务:

A=imread('Lena.bmp');%sample image
if mod(size(A,1),2)
A = A(1:(end-1),:,:);
end
if mod(size(A,2),2)
A = A(:,1:(end-1),:);
end
while size(A,1) > 128
A = A(2:(end-1),:,:);
end
while size(A,2) > 128
A = A(:,2:(end-1),:);
end
imshow(A)

代码从每一侧移除一个像素,直到我们得到128像素的图像。

答案 1 :(得分:1)

小心!在您的代码中,如果您加载彩色图像(3个频道)并仅使用两个输出调用size,则p4的值将不正确。

加载图像时使用三个输出以避免此问题: [nrows ncols nchannels] = size(II); 您的代码正确地从图像中心提取(q1 x q1)。

如果您想要一个随机补丁,只需为补丁的左上栏生成一个随机整数,并使用正确的范围,以确保它不会落在图像之外。您可以使用函数randi生成随机整数。

i3_start = randi(floor((p3-q1));
i4_start = randi(floor((p4-q1));

其余代码是相同的。如果您需要多个补丁,则可以在使用第二个和第三个参数调用randi函数时生成多个值,以获得所需的行数和列数。然后在for循环中处理每个补丁。

BTW:在第三行中,您有一个无效的Matlab评论(使用%进行评论)。您还应该使用更直观的名称命名变量。

例如:[nrows ncols nchannels] = size(II);