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),温度(:,:)); %//更改
答案 0 :(得分:2)
那是因为你没有正确地调用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
如何在这里工作:How does subplot work and what is the difference between subplot(121) and subplot(1,2,1) in MATLAB?
阅读完这篇文章后,您将更好地了解每个参数如何适用于subplot
,以及如何在图中显示图形/图像。
看起来你接受了代码from this post,但你没有正确地复制和粘贴:) %// Change
注释以及变量名ca
看起来很奇怪。