0

当我尝试通过计算 4 个像素的平均值来获得一个像素来调整图像大小时,我遇到了一个问题,下面是我的代码,请帮助我,这让我发疯

a=imread('c:\black and white.jpg');
[rows,columns,phases]=size(a);
i=1;j=1;k=1;
c=zeros(rows/2,columns/2,phases);
c=uint8(c);
for x=1:2:rows-1;
    for y=1:2:columns;
        for z=1:phases;
        c(i,j,k)=1/4*(a(x,y,z)+a(x,y+1,z)+a(x+1,y,z)+a(x+1,y+1,z));
        k=k+1;
        end
    j=j+1;
    k=1;
    end
    i=i+1;
    j=1;
    k=1;
end
figure, imshow(a)
figure, imshow(c)
4

2 回答 2

1

您可以在没有循环的情况下执行此操作,方法是沿每列计算块平均值,然后对每一行进行记录,如下所示。

我假设您的数据是图像,即二维数组。如果您有一个 3D 数组,其中沿第 3 维堆积了多个图像(就像在您的代码中那样),只需将其应用于每个图像(即,对于第 3 个索引的每个值)。

矩阵大小和块大小是任意的,只要块大小除以输入矩阵的行数和列数即可a

a = rand(100,120); % example data
n = 2; % block size
m = size(a)/n; % assumed to be integer
c = reshape(mean(reshape(a,n,[])),m(1),[]).'; % mean by colummns in groups of n
c = reshape(mean(reshape(c,n,[])),m(2),[]).'; % mean by rows in groups of n
于 2013-10-25T11:45:26.597 回答
0

假设您有一个名为的图像,也许您的问题就这么简单myImage

首先确保每个方向的像素数是偶数

myImage = myImage(1:fix(end/2)*2,1:fix(end/2)*2)

然后取每4个像素的平均值

(myImage(1:2:end,1:2:end)+myImage(2:2:end,1:2:end)+ ...
myImage(1:2:end,2:2:end)+myImage(2:2:end,2:2:end))/4

请注意,这假设您不介意丢失最后一行或最后一列像素,否则您需要做一些更聪明的事情。

于 2013-10-25T12:36:44.333 回答