背景:数字图像处理(DIP)入门时对matlab中的图片在不同情况下的数据类型不太理解,其中包括imread()、mat2gray()、int8()等函数,在这里简单整理一下。
首先需要明确imread()得到数据类型多数情况下为unsigned char类型。数据范围为1-255。 这时用imshow()显示图像的时候, imshow()会认为输入矩阵的范围在0-255, 如果imshow的参数为double类型的,那么imshow认为输入矩阵的值为0-1。imread()的文档如下image1。
imshow()的用法:
imshow(I)以图形的形式显示灰度图像I。imshow为图像显示优化图形、轴和图像对象属性。
imshow(I,[low - high])显示灰度图像I,指定显示范围为二元向量[low - high]。有关更多信息,请参见DisplayRange参数。
imshow(I,[])显示灰度图像I,根据I中的像素值范围缩放显示。imshow使用[min(I(:))) max(I(:(:))]作为显示范围。imshow将I中的最小值显示为黑色,最大值显示为白色。有关更多信息,请参见DisplayRange参数。
imshow()的官方文档如下图image2:
当涉及到频域等处理时候,或进行如拉普拉斯滤波时滤波器中有负数值,需要转换成double类型,否则负数会被置零处理结果出错,需要将字节型数据转换为double类型,matlab提供了2两个函数,im2double和double函数,均可使用,两者的区别则极其重要,直接用double转换以后用imshow()显示的是一片白色, 是因为当imshow()显示图像的时候, 会认为double类型的图像矩阵的范围在0-1,小于0的像素被置零, 超过1的像素值当作1处理, 这样就是几乎所有的像素都是白色。如果想要正常imshow()显示double类型的数据可以用mat2gray()处理一下。
mat2gray 把一个double类的任意数组转换成值范围在[0,1]的归一化double类数组。
im2double 函数将所有像素数据转化为[0 1]区间之内,这也是数字图像处理工具箱的要求,但是double函数则仅仅提高数据精度,但是并未将数据量化到[0 1]区间之内。
综合效果如下图image3所示。
适应场合:当你需要做频域滤波处理,需要注意不要使用im2double函数,否则滤波之后,图像在傅里叶反变换之后,所有像素数据都是0,也就是说图像纯黑色。与此对应,当你使用数字图像处理工具箱的时候,建议使用im2double函数。
如果一个图像经过处理后需要显示出来,但是图像的最大像素值远小于255,此时是用imshow()还是用imshow(i,[])?
这一点曾使我迷惑,但经过对比原图像的像素值和处理后的像素值不难发现可能两幅图像的最大像素值都远小于255,这样的话就不难理解,此时应该直接用imshow()显示结果,如果将原图像映射到[0-1]或者[0-255]再显示就相当于把图像对比度拉伸了,拉伸后的图像就不是原图像了,拉伸后的图像视觉效果会更好一些,毕竟对比度被提高了。对比下图中image4的‘prcessed image’和下面两幅扩展后的图可以看出差异。
im2uint8 将输入数据映射到1-255上,数据中所有小于0的设置为0,而将输入中所有大于1的设置为255, 其他的所有乘以255,此时就可以直接用imshow()显示数据。
im2uint16与im2uint8类似。
能想到的暂且就这些。