我有一个大小(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);
答案 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
这给出了5张这样的照片:
此处我们的图片尺寸为512x512。因此,如果我们想要从中切割128x128,我们需要寻找385x385网格(512-127)。我们在rnd_x
和rnd_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);