当我尝试通过计算平均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)
答案 0 :(得分:1)
你可以在没有循环的情况下,通过计算每列的块平均值,然后调整每一行,如下所示。
我假设您的数据是图像,即2D数组。如果你有一个3D阵列,其中有三个图像沿着第三维堆积(似乎在你的代码中),只需将它应用于每个图像(即,对于第三个索引的每个值)。
矩阵大小和块大小是任意的,只要块大小除以输入矩阵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
答案 1 :(得分: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
请注意,这假设您不介意丢失最后一行或一列像素,否则您需要做更聪明的事情。