让我们一次一个地回答每个问题。
问题 #1
您的问题陈述说您想要放大,但您所描述的是简单的调整大小。我要两个都做。
首先,您要寻找的是像素复制。最简单的做法是声明一个两倍于输入图像大小的输出图像,然后编写代码,将每个输入像素复制到输出,然后将其复制到右下角和右下角。例如,使用 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
请注意,我们对数组进行索引的方式是跳过一个像素,并且起始位置会根据您要复制像素的位置而改变。
这是原图:
这是最终结果:
顺便说一句,通常当您增加图像的大小时,您正在上采样,您通常对结果进行低通滤波以执行anti-aliasing。
现在,如果您想放大某个部分,您所要做的就是从上采样图像中选择一个您想要的部分并进行裁剪。这就引出了你的下一个问题。
问题 #2
这可以简单地通过索引来完成。给定要提取的左上角的行和列位置,以及要裁剪的内容的宽度和高度,您只需执行此操作。 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;