Matlab imread()函数详解
Imread()函数可以显示 uint8 型和 double 型数据,但是其数据的范围是不同的:
1) If A=uint8 型,取值范围为 0~255,则可以正常显示图像;如果取值为 0、1(或 0~1 之
间的小数)时,显示的图像为黑色的;
2) If A=double 型,取值为 0~255 时,显示的几乎为白色(或许有几个白点),这是因为
imshow 显示 double 型的数据要求是在 0~1 之间的数,超过 1 的数据被认为是 1,这样
就大部分超过 1 的数据归为 1,‘1’在这种图像中是白点,0 是黑点,中间的小数是各级
灰度值,遇到这种问题的话,可以将数据除以 255,因为数据 是 double 型,这就相当
于数据的归一化,将 0~255 之间的 double 型数据/255 得到 0~1 之间的小数,然而
imshow 函数显示 double 型数据要求其值范围为 0~1,这样就可以正常显示了。
例如:B 为 0~255 的 uint8 型,imshow(B) 显示的为灰度图;
imshow(double(B)), 显示的是二值图像,且只有像素点为 0 的为黑色,其余的
>=1 的为白色,double(B)并没有给 B 归一化,而只是有 uint8 型变为 double
型,其大小并未改变;
imshow(double(B/255)),显示的也是二值图,因为 B 为 uint8 型,uint8/255 相
当于整除,得到的数为 0 或 1,在 double()后也是只有两个数,所以图像为
二值图;
imshow(double(B2)/255)显示的为正常的灰度图像,因为 B2 为 uint8 型,
double 后为 double 型,其大小未改变,除以 255 后为 0~1 之间的数,数据又是
double 型,所以可以正常显示;
如果 A2 是 0~1 之间的 double 型数据,A3=uint8(A2*255),imshow(A3),显
示的为正常灰度图,因为 A2*255 为 0~255 之间的 double 型,uint8 之后转化为
0~255 的 uint8 型,所以可以正常显示;
3) 当数据范围是 0~1 之间的 double 型时,如果要将数据转化为 0~255 的 uint8 型数据且正
常显示,可以用 uint8(A*255)转换;切不可用 uint8(A)*255,应为 A 是 0~1 之间的
数,uint8(A)的话相当于将 A 四舍五入,得到的是 0 和 1 的数据,再乘以 255 的话得
到的是 0 和 255 这两个数,显示的图像为二值图,而非灰度图;例如 uint8(0.5)=1;
Uint8(0.499999)=0 这就类似与函数 round();
4) double(A)/255 与 uint8(A)/255 的区别: double(A)/255 相当于归一化,得到
的还是 0~1 之间的 double 型数据,所以 imshow 函数可以正常显示图像;uint8(A)/
255 相当于取 C 语言中的除法,因为 A 是 0~255,所以得到的是 1 或 0 的 uint8 型数据,
显示的图像看上去全为黑色,就是这个原因,所以要对图像归一化的话一定要将图像
先转为 double 型,否者容易出错,一般为 I=double(A)/255;而不是 I=double(A/
255),这样得到的是 double 型的 0 和 1;图像改为二值图。
评论1