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

Image 如何从图像中裁剪多个随机批次?,image,matlab,Image,Matlab,我有一个大小为(224x224)的图像,我想使用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 nei

我有一个大小为(224x224)的图像,我想使用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);

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

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
这张照片是这样拍摄的:

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

这里我们的图像大小是512x512。因此,如果我们想从中切割128x128块,我们需要从385x385网格(512-127)中寻找。我们在网格上找到5个随机点,表示为
rnd_x
rnd_y
。最后,我们将找到的点作为片段的左上角,并从中构造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像素的图像。

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

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

如果您想要一个随机补丁,只需为补丁的左上列生成一个具有正确范围的随机整数,以确保它不会超出图像范围。您可以使用函数
randi
生成随机整数

i3_start = randi(floor((p3-q1));
i4_start = randi(floor((p4-q1));
代码的其余部分是相同的。如果需要多个修补程序,则可以在调用
randi
函数时生成多个值,并为所需的行数和列数指定第二个和第三个参数。然后在for循环中处理每个补丁

顺便说一句:在第三行中,您有一个无效的Matlab注释(请使用
%
进行注释)。此外,还应使用更直观的名称命名变量


例如:
[nrows ncols nchannels]=尺寸(II)

如果你想从中心采集样本,它怎么会是随机样本?图像只是一个矩阵。您可以访问矩阵的元素和范围以提取面片。看看这个矩阵索引。其中一个应该在中心,然后我们可以将下一个补丁的中心向左、向右、向上或向下移动,得到另一个补丁。是的,我对Matlab很了解,我也试过这个代码:II=imread('img.png')[p3,p4]=size(II);q1=50;//裁剪箱的尺寸i3_开始=地板((p3-q1)/2);%或圆形而不是地板;使用两者都不会发出警告i3\u停止=i3\u启动+q1;i4_开始=地板((p4-q1)/2);i4_停止=i4_启动+q1;II=II(i3_启动:i3_停止,i4_启动:i4_停止,:);图,imshow(II);请问,你能把问题中的代码,并格式化为代码吗?亲爱的Brainkz&BlackAdder谢谢你的帮助