I=imread('ft.jpg');
[a b]=size(I);
figure;imshow(I);
j=rgb2ycbcr(I);
[m n]=size(j);
figure;
imshow(j);
ca=mat2cell(j,8*ones(1,size(j,1)/8),8*ones(1,size(j,2)/8),3);
p = 1;
figure;
figure;
X=ones(m,n,8,8);
for c=1:size(ca,1)
for r=1:size(ca,2)
temp=zeros(8,8,'uint8');
temp(:,:)=X(c,r,:,:);
temp=temp-128;
temp=dct2(temp);
subplot(size(ca,1),size(ca,2),temp(:,:)); %// Change
imshow(ca{c,r});
p=p+1;
end
end
错误是: 在 309 处使用 ==> 子图时出错非法地块编号。
==> 项目中的错误 22 子图(大小(ca,1),大小(ca,2),temp(:,:)); %//更改
那是因为你没有正确调用subplot
。 它需要p
作为第三个参数的参数,而不是temp
。 p
确定要将图形放入哪个插槽。 你输入一个double
向量作为第三个参数是没有意义的。 此外,ca
包含 8 x 8 像素块,您希望显示每个块的 DCT。 您当前的代码不执行此操作。 实际上,X
是您要查找的DCT,并且都是一个。没有多大意义。
您可能还想在图中显示每个块的 DCT,而不是ca
....所以你需要这样做:
for c=1:size(ca,1)
for r=1:size(ca,2)
temp = double(ca{c,r}); %// Change - cast to double for precision
temp=temp-128;
temp=dct2(temp);
subplot(size(ca,1),size(ca,2),p); %// Change
imshow(temp,[]); %// Change here too
p=p+1;
end
end
请注意,我做了imshow(temp,[]);
,以便我们可以对比拉伸块,以便最小值映射到黑色,而最大值映射到白色。 其他一切都介于两者之间是灰色阴影。 请注意,这不会更改图像本身。 它只更改它以显示。
建议
您应该阅读我关于subplot
如何工作的文章:子图如何工作以及 MATLAB 中的子图(121) 和子图(1,2,1) 有什么区别?
阅读这篇文章后,您将更好地了解每个参数如何用于subplot
,以及如何在图形中显示图形/图像。
小音符
看起来您从这篇文章中获取了该代码,但您没有正确复制和粘贴:) 那%// Change
评论,以及变量名称ca
看起来非常熟悉。