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

  • 本文关键字:显示 子图 DCT2 8x8 应用 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),temp(:,:)); %//更改

那是因为你没有正确调用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如何工作的文章:子图如何工作以及 MATLAB 中的子图(121) 和子图(1,2,1) 有什么区别?

阅读这篇文章后,您将更好地了解每个参数如何用于subplot,以及如何在图形中显示图形/图像。

小音符

看起来您从这篇文章中获取了该代码,但您没有正确复制和粘贴:) 那%// Change评论,以及变量名称ca看起来非常熟悉。

最新更新