首页 > 解决方案 > 使用 for 循环缩小和重新缩放图像

问题描述

我对 Matlab 比较陌生,并试图理解为什么一段代码不起作用。

我有一个 512x512 图像需要缩小到 256,然后重新调整到 512。我对数学的理解是,我需要指图像中的像素才能得到 256,然后将它们加起来得到 512。这是正确的吗?以下是我正在查看的代码,如果有人可以解释我出了什么问题(它给出了一个空白的白色图像),我将不胜感激:

w = double(imread('walkbridge.tif'));
%read the image

w = w(:,:,1);

for x = 1:256
    for y  = 1:256
        s256(x,y) = (w(2*x,2*y)+ w(2*x,(2*y)-1) + w((2*x)-1,2*y)+ w((2*x)-1,(2*y)-1))/4;
    end
end

for x = 1 : 256
    for y = 1 : 256
        for x1 = 0:1
            for y1 = 0:1
                R1((2*x)-x1,((2*y)-y1)) = s256(x,y);
            end
        end
    end
end

imshow(R1)

标签: matlab

解决方案


我让您的代码正常工作,因此您的图像数据中可能有一些错误的值。也就是说,如果您的图像的值在 0..127 或类似范围内,它很可能会显示为全白。默认情况下,imshow期望颜色通道在 0..1 范围内。

您可能还想通过索引原始数组而不是访问单个元素来稍微简化代码。这样代码甚至很容易更改:

half_size = 256;

w = magic(2*half_size);
w = w / max(w(:));

figure()
imshow(w)

s = zeros(half_size);
for x = 1:half_size
    for y  = 1:half_size
        ix = w(2*x-1:2*x, 2*y-1:2*y);
        s(x,y) = sum(ix(:))/4;
    end
end

for x = 1:half_size
    for y = 1:half_size
        R1(2*x-1:2*x, 2*y-1:2*y) = s(x,y);
    end
end

figure()
imshow(R1)

我想计算甚至可以以某种方式向量化而不是循环,但我没有打扰。


推荐阅读