复制图像中的像素并将其大小加倍

Replicating pixels in an image and doubling its size

我正在尝试复制矩阵或图像中的每个元素,并试图将图像的大小增加 4。这意味着行和列的大小加倍。

我试图通过使用 for 循环而不使用数组索引来做到这一点。这是我目前所拥有的。

function output = zoomx(img)
[r,c] = size(img);
output = img(r,c);
[r1, c1] = size(output);
for x = 1:r1
    for y = 1:c1
        j = 4*x;
        i = 4*y;
        output(j,i) = img(x,y);
    end
end
end

到目前为止,我正在尝试做的是遍历我的输出矩阵,并将每个元素乘以 4,但我得到的只是一个巨大的零矩阵,新矩阵中的每个元素间隔开每个元素之间有 4 行和 4 列零和零。

如有任何帮助,我们将不胜感激!

谢谢。

我假设您的目标是将图像的尺寸因子增加 4,这意味着行和列的尺寸加倍。您需要做的是创建一个输出图像,其行数和列数是原始图像的两倍,然后对于原始图像中的每个像素,您需要将原始图像中的像素复制到右侧、底部和右下位置.

请注意,您的第二行代码 output = img(r,c) 不正确。这是访问位于原始图像左下角的单个像素。您可能打算使用 zeros。此外,当您缩小图像时,可以在我之前的 post 中向您展示您访问输出中复制像素的位置的方式: 。如果您还记得,行和列的输入到输出映射是:

j = factor*(x-1) + 1;
i = factor*(y-1) + 1;

在我们的例子中,因为你想将图像的大小加倍,所以你会设置 factor = 2。此外,我们将逆转该操作。我们需要 ij 作为输出图像,而不是访问输入图像。我们还需要将 ij 移动 +1 以设置输出的每个加倍块的右侧、底部和右下像素。

因此:

function output = zoomx(img)
[r,c] = size(img);
output = zeros(2*r,2*c,class(img)); %// Change
for x = 1:r %// Change
    for y = 1:c
        j = 2*(x-1) + 1; %// Change
        i = 2*(y-1) + 1; %// Change           
        output(j,i) = img(x,y); %// Top-left
        output(j+1,i) = img(x,y); %// Bottom-left
        output(j,i+1) = img(x,y); %// Top-right
        output(j+1,i+1) = img(x,y); %// Bottom-right
    end
end
end

使用示例:

>> im = imread('cameraman.tif');
>> out = zoomx(im);
>> imshow(out);

输入图像:

输出图像: