我有两个与缩放和裁剪图像有关的问题。
1)放大图像,使图像的高度和宽度都增加两倍,矩阵中的每个像素都被复制成4个像素。想知道这是否可以在不使用任何循环或插值的情况下完成,并且函数可以实现。
2)通过选择图像的某个区域然后将其裁剪到一定的长度和高度来裁剪矩阵。再一次,我想知道如何在不使用任何循环或插值的情况下实现这一点,并且函数可以实现。也许从矩阵中删除某个列和行?
如何为这些创建功能的任何帮助将不胜感激。 :)
答案 0 :(得分:3)
让我们一次回答每个问题。
您的问题陈述表明您要放大,但您所描述的是一个简单的大小调整。我要去做两件事。
首先,您所寻求的是像素重复。最简单的方法是声明输出图像大小是输入图像大小的两倍,然后编写将每个输入像素复制到输出的代码,将其复制到右侧,右下角和右下角。例如,使用MATLAB系统路径中的onion.png
,您可以执行以下操作:
im = imread('onion.png');
rows = size(im,1);
cols = size(im,2);
out = zeros(2*rows, 2*cols, size(im,3), class(im));
out(1:2:end,1:2:end,:) = im; %// Left
out(2:2:end,1:2:end,:) = im; %// Bottom
out(1:2:end,2:2:end,:) = im; %// Right
out(2:2:end,2:2:end,:) = im; %// Bottom-Right
请注意,我们索引数组的方式是跳过一个像素,并且起始位置会根据您要复制像素的位置而改变。
这是原始图片:
这是最终结果:
BTW,通常当您增加图像的大小时,您进行上采样,通常会对结果进行低通滤波以执行anti-aliasing。
现在,如果你想放大到一个部分,你所要做的就是从上采样图像中选择你想要的部分然后裁剪它。这导致您的下一个问题。
这可以简单地通过索引来完成。给定要提取的左上角的行和列位置,以及要裁剪的宽度和高度,您只需执行此操作即可。 r
和c
是左上角的行和列,w
和h
是裁剪结果的宽度和高度:
out = im(r:r+h-1, c:c+w-1,:);
我们说(r,c) = (50,50)
和(w,h) = (50,50)
。对于我们的onion.png
图片,我们得到:
r = 50; c = 50;
h = 50; w = 50;
out = im(r:r+h-1, c:c+w-1,:);
如果要将裁剪后的图像放在原始图像中的其他位置,则只需重复上述步骤,但输出将分配到原始图像中的位置。如果要将r2
和c2
设置为要将图像保存到原始图像中的左上角,请执行以下操作:
im(r2:r2+h-1, c2:c2+w-1, :) = out;