调整大小和重复图像

时间:2014-11-14 17:14:14

标签: image matlab resize

我遇到了图像问题。我试图拍摄一张图像并将其设置为原始尺寸的1/4,然后将其重复为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阵列。有什么建议?这次实际上不是HW :)这是为了研究目的。这是我到目前为止所尝试的内容:

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

我会在进一步处理时更新。谢谢!

3 个答案:

答案 0 :(得分: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坐标的像素的最近邻插值。其他3将是(偶数/奇数),(奇数/偶数),(偶数/偶数)。 img1中的每个像素都显示在img2中,每个子图像可能略有不同。

如果我们想要将来自4个图像中的每个图像的数据组合成单个图像而不丢弃所有数据,我们可以稍微改变一下。我们只取4张图片的平均值。请注意,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默认使用双三次插值,因此其结果会略有不同。)

答案 1 :(得分: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/2。这相当于将图像缩小到1/4。 finalI是重复4次的最终图像。 repmat将矩阵连接2x2次。

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

答案 2 :(得分: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