缩放和裁剪图像(矩阵)
Zoom and Crop Image (Matrix)
我有 2 个关于图像缩放和裁剪的问题。
1) 放大图像,使图像的高度和宽度都大两倍,矩阵中的每个像素都被复制为 4 个像素。想知道这是否可以在不使用任何循环或插值和函数 imresize 的情况下完成。
2) 通过选择图像的特定区域然后将其裁剪到特定的长度和高度来裁剪矩阵。同样,我想知道如何在不使用任何循环或插值和函数 imresize 的情况下实现这一点。也许通过从矩阵中删除特定的列和行?
如能提供有关如何为这些函数创建函数的任何帮助,我们将不胜感激。 :)
让我们一次回答一个问题。
问题 #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;
我有 2 个关于图像缩放和裁剪的问题。
1) 放大图像,使图像的高度和宽度都大两倍,矩阵中的每个像素都被复制为 4 个像素。想知道这是否可以在不使用任何循环或插值和函数 imresize 的情况下完成。
2) 通过选择图像的特定区域然后将其裁剪到特定的长度和高度来裁剪矩阵。同样,我想知道如何在不使用任何循环或插值和函数 imresize 的情况下实现这一点。也许通过从矩阵中删除特定的列和行?
如能提供有关如何为这些函数创建函数的任何帮助,我们将不胜感激。 :)
让我们一次回答一个问题。
问题 #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;