如何在8x8块上应用精确的dct2并在子图中显示它们?

时间:2014-11-26 16:25:55

标签: matlab

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),温度(:,:)); %//更改

1 个答案:

答案 0 :(得分:2)

那是因为你没有正确地调用subplot。它需要p作为第三个参数的参数,而不是tempp确定您要将图放入哪个插槽。您输入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看起来很奇怪。