注意显示的区间

from:  http://bbs.sjtu.edu.cn/bbscon?board=EE&file=M.1146973330.A
1. 虽然RGB图像是3维矩阵,但你的图像处理程序一般只要分别对RGB三色的每一维进行相
同的处理就可以了。换言之,如果图像是3维矩阵I(:,:,:),,你只要用dct2分别对I(:,:
,1)、I(:,:,2)、I(:,:,3)进行处理(总共3次)就可以完成对整个图像的处理了。所以dc
t2已经够用。
2. idct2(dct(image(:,:,1)))的确在数值上没变,但是idct2()得到的结果是double类型
的数据,而你原图的类型一般是整型的。而imshow()对整型和double类型的处理完全不同
:整型图像数据有uint8,uint16等多种,其单像素幅度值分布可以从0到2^N,(N=8,16等),
其中0为全黑,2^N-1为全白;但double类型的图像像素幅度值分布范围只能在0和1之间,
0为全黑,1为全白。如果幅度有负值就当作0,有大于上界的值就当作1。
现在再看你的问题就会明白原因在哪儿了:原图矩阵是整型值,dct2()后矩阵变为double
类型,再用idct2()时虽然从数值上把矩阵恢复为原图,但数据类型却是double。此时如果
直接用imshow()显示idct2()得到的double类型矩阵,结果显然不对了:因为整型的原图大
多数像素值都为大于0的整数,而且也没有小于1的小数值,所以大多数像素值都被imshow
()认为超过上界,全都当1处理了()全白。下面的例子(matlab脚本)可以简单地说明上面
的现象:
a=uint8(2*one(500));
figure(1)
imshow(a);//显示出一幅近似全黑的图片
b=double(a);//只对a进行类型转化而不改变其数值大小
figure(2)//打开新窗口
imshow(b);//显示出的是一幅与原图大小完全相同,但是全白的图片

你的问题可以用下面的方法解决:
只要对idct2()操作后得到的double类型矩阵I作如下类型转换即可:
I=uint8(I);
//如果你的原图类型是uint16或者其他类型,则需要把uint8()替换为相应类型转换函数。
 

你可能感兴趣的:(注意显示的区间)