缩小for循环

时间:2015-03-06 19:30:28

标签: image matlab image-processing

Just like the previous shrink question,我正在努力做到这一点,但稍作修改并使用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分配到适当的象限,然后将其除以4,但会发生的事情是它不起作用,因为我超过了图像的尺寸。我的另一种方法是找到一个关系,用于挑选彼此的像素,然后将其实现到代码中。任何帮助将不胜感激!

顺便说一下@rayryeng,你得到了很大的帮助,我很欣赏你的所作所为,但对于这个特殊的问题,我想知道你是否能“暗示”我正确的方向而不是完整的代码。不要试图粗鲁或任何事情!如果我的方法完全不正确,并且我需要开始思考,因为这是我的第一个编码课程,也请随时告诉我。再一次谢谢你。

1 个答案:

答案 0 :(得分:2)

我注意到你提出的所有问题,你似乎都有索引问题。在此处发布更多问题之前,您应该参考一些MATLAB教程。无论如何,您的代码几乎是正确的。您需要声明一个具有输入维度一半的输出图像,然后在每一步中正确地索引到输出。我不会像在其他帖子中那样详细介绍,因为我在那里详细介绍了如何索引放大和缩小图像,但看起来这里不仅要缩小图像,而且还要做平滑也。因此,从our previous post借用,您只需修改该代码即可包含从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);

输入

enter image description here

输出

enter image description here