使用 for 循环收缩

Shrinking with for loops

,我正在努力做到这一点,但稍作修改并使用 for 循环。

我的代码是这样的,我会解释我想要表达的内容,只是为了给你一些背景知识。

    function output = shrinkx(img)
    [r,c] = size(img);
    output = zeros(r,c);
for x = 1:r
    for y = 1:c
   i    mg = (img(x,y) + img(x+1,y) + img(x,y+1) + img(x+1,y+1))/4;
       output = img;
    end
end
end

我想做的是将 img 分配给适当的象限,然后将其除以四,但结果是它不起作用,因为我超出了图像的尺寸.我的另一种方法是找到一种关系来挑选彼此的像素,然后将其实现到代码中。任何帮助将不胜感激!

顺便说一下@rayryeng,你帮了我大忙,我很感激你所做的,但是对于这个特定的问题,我想知道你是否可以 'hint' 让我进入正确的方向而不是完全代码。不想表现得粗鲁什么的!如果我的方法完全不正确,以及我是否需要开始以不同的方式思考,因为这是我的第一门编码课程,请随时告诉我。再一次感谢你。

我注意到在你提出的所有问题中,你似乎对索引有问题。在此处发布更多问题之前,您真的应该查阅一些 MATLAB 教程。无论如何,您的代码几乎是正确的。您需要声明一个具有输入尺寸一半的输出图像,然后在每一步正确地索引到输出中。我不会像在其他帖子中那样在这里详细介绍,因为我确实在那里详细介绍了如何为放大和缩小图像建立索引,但看起来在这里您不仅想要缩小图像,而且还也做平滑处理。因此,借用 ,您只需修改该代码以包括从 2 x 2 块中获取像素。

您只需更改几处。一方面,您不再需要 factor 作为输入,因为现在只是 2。此外,您需要确保输出图像最初是 double,以便在添加时值并找到局部平均值,图像不会饱和。您还需要将输入图像的类型更改为 double,以确保不会发生饱和。

如果您将图像设置为与输入图像相同的类型,它不可避免地会使输出饱和,因为您将超过执行求和时读取图像的特定数据类型的最大值操作。当你完成输出中的每个像素时,只在最后 投射图像

function output = shrinkx(img) %// factor is not an input anymore
class_im = class(img); %// Save class of original image
img = double(img); %// Cast image to double for precision
[r, c] = size(img);

output = zeros(floor(r/2),floor(c/2)); %// Factor is now 2
[rnew, cnew] = size(output); 

for x = 1:rnew
    for y = 1:cnew
        j = 2*(x-1) + 1; %// Change - factor is 2
        i = 2*(y-1) + 1;
        output(x,y) = (img(j,i) + img(j,i+1) + img(j+1,i) + img(j+1,i+1))/4; %// Change here
    end
end

output = cast(output, class_im); %// Change

end

使用示例:

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

输入

输出