调整大小和重复图像

3

我遇到了一个关于图片的问题。我想将一张图片缩小至原来的四分之一,然后将其重复成一个2x2矩阵。就像这样:

Given an input image:
           ---------------------
           |                   |
           |                   |
           |       IMG         | 
           |                   |
           |                   |
           ---------------------

   Firstly, shrink it to 1/4 of its original size:
           -----------
           |   img   | 
           |         | 
           |---------|

   Then concatenate it into a "2x2 array" of the shrunken image:
           ---------------------
           |   img   |   img   |
           |         |         |
           |---------|---------| 
           |   img   |   img   |
           |         |         |
           ---------------------

我遇到的问题是我不知道如何将它转换为2x2的数组。有什么建议吗?这次不是作业,只是为了学习目的。以下是我到目前为止尝试过的:

function[newImg] = immultiply(picture)

Image = imread(picture); %// Reads in the picture
[r, c, l] = size(Image); %// Finds the images rows, columns and layers
rows = round(r ./ 2); %// Divides up the rows
columns = round(c ./ 2); %// Divides up the columns

newImg = cat(3,rows,columns,3); %// Creates my image, but just gives me a blank thing
imshow(newImg)


end

我会在进一步的工作中进行更新。谢谢!

对于连接部分,您可以使用 repmatrepmat(img,2,2),但那并不是 2 x 2,它更像是沿行和列扩大了两倍的 img - Divakar
你不能使用imresize,对吗? - Benoit_11
如果你想要一个单元数组,那么你可以使用repmat({img},2,2)来输出一个大小为2 x 2的单元数组。 - Divakar
我从未学过那些函数。我们可以调整大小,但是那种冗长的方式似乎不正确。 - Jessica Marie
3个回答

4

前面两个答案都是正确的,我最初只是在玩耍,本来不打算发布它,但稍加修改后,我认为它解决了Luis Mendo对Kamtal答案的部分评论。

我的原始想法是,为什么要丢弃数据?如果你将采样率降低到1/4,但又绘制了其中的4个,那么你就有足够的空间来存储所有的数据:

img1 = imread('myimage.png');
subplot(1,2,1),imshow(img1) 
img2 = img1([1:2:end, 2:2:end], [1:2:end, 2:2:end]); 
subplot(1,2,2),imshow(img2);

img2 的左上象限将与 Kamtal 答案产生完全相同的效果: 它是由具有奇数值 x 和 y 坐标的像素进行最近邻插值得出的。其他三个部分将是 (偶数/奇数), (奇数/偶数), (偶数/偶数)。 img1 中的每个像素都会出现在 img2 中,而且每个子图像可能略有不同。

如果我们想将这四个图像的数据合并为一个图像,而不是丢弃 所有 数据,我们可以稍作更改。我们只需要取这四个图像的平均值即可。请注意,这里的 img2 与上面是相同的,我只是将计算分解开来,以使其更明显。

img1 = imread('myimage.png');
subplot(1,3,1),imshow(img1) 
img2a = img1(1:2:end, 1:2:end);
img2b = img1(1:2:end, 2:2:end);
img2c = img1(2:2:end, 1:2:end);
img2d = img1(2:2:end, 2:2:end);
img2 = [img2a img2b; img2c img2d];
subplot(1,3,2),imshow(img2);
img3a = (img2a + img2b + img2c + img2d)/4;
img3 = [img3a img3a; img3a img3a];
subplot(1,3,3),imshow(img3);

这里的img3显示了4张相同的图片,它们都是通过使用平均滤波对原始图像进行下采样得到的。
要使用滤波器来做到这一点,您需要使用以下核心:
[0.25 0.25]
[0.25 0.25]

这只是取邻域内4个元素的平均值。如果核心的原点是(1,1),你的插值、下采样图像将与之前一样位于奇数行/列:

img1 = imread('myimage.png');
subplot(1,2,1),imshow(img1) 
h = [0.25, 0.25; 0.25, 0.25]   //% define the mean filter kernel
img2a = imfilter(img1, h);     //% filter before applying Kamtal's solution
img2b = img2a(1:2:end, 1:2:end);
img2 = [img2b img2b; img2b img2b]; 
subplot(1,2,2),imshow(img2);

生成的图像应该与上面的img3相同。

顺便提一下,使用2x2核进行均值滤波,然后缩小到1/4大小实际上是双线性插值。 imresize默认使用双三次插值,因此其结果会略有不同。


3

只需使用imresizerepmat指令即可。

i = imread('lena.png');

figure(1),subplot(1,2,1),imshow(i) 
[n,m,d] = size(i);

newI = imresize(i,0.5); 
finalI = repmat(newI,2,2); 
figure(1),subplot(1,2,2),imshow(finalI);

newI是缩小到原来的1/4大小的图像。相当于将图像缩小到1/2。 finalI是最终图像,重复4次。 repmat是将矩阵连接2x2次。

我强烈建议您查看这两个函数的文档: http://uk.mathworks.com/help/images/ref/imresize.html http://uk.mathworks.com/help/matlab/ref/repmat.html


我不太舒服在测试中使用那些。这个“作业”是为了帮助下周的考试。我们没有学习imresize或repmat。 - Jessica Marie
嗯,如果你要使用Matlab工作,不要试图重新发明轮子。许多东西已经实现了,如果你学会如何使用它们,Matlab是非常强大的。 - enric.cornella
1
如果您想要正确调整图像大小,请使用“imresize”。它会正确地应用抗锯齿并处理边缘情况,所以这篇文章是非常有价值的。但是,由于这是一个练习,旨在测试对MATLAB的理解,使用学到的技巧而不使用其他功能,因此需要在问题陈述中明确说明,以免建议不能使用的内容。 - rayryeng

2
之前的回答已经完美地回答了你的问题。然而,如果你不想使用imresizerepmat函数,
im = imread('peppers.png');
subplot(1,2,1),imshow(im) 
im1 = im(1 : 2 : end, 1 : 2 : end,:); 
im2 = [im1 im1; im1 im1]; 
subplot(1,2,2),imshow(im2);

enter image description here


2
该行代码 im(1 : 2 : end, 1 : 2 : end,:) 简单地进行了下采样。最好先应用一些抗混叠滤波器。例如,对每个2x2像素块求平均值。 - Luis Mendo
1
如果您不想使用repmatimresize,则此方法是不错的。然而,由于您没有进行插值,因此将会失去一半的信息。 - enric.cornella
1
@Kamtal。别名现象发生在你移除采样时。在下采样之前的滤波器可以防止别名现象的发生。 - Luis Mendo
Kamtal,我认为我的回答可能可以解决 @LuisMendo 的评论中的一部分问题。 - beaker
@rayryeng 感谢您的评论 :-) 我觉得很有趣,您也使用了棋盘示例; 我只是为这个场合而编造它。但我猜这是脑海中浮现的第一个例子。 - Luis Mendo
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接