[求助]关于matlab的图像显示出现的问题
已经遇到过几次这种问题了,为什么对于有些图像仅仅运行I=imread('文件名');
imshow(I);
这么简单的程序,出现的图片显示结果和原始图像的显示效果不一致?有的情况是灰度出现了问题,有的则会出现类似加噪后的情况呢?
例如经典的lenna测试图像,运行后在matlab中显示如下图:
因为matalab图像的颜色图小于256行时,采用的是unit8格式存储,否则一般是double形式
关于这个问题,你可以看看下面的文章
一:imread:从图像文件夹中读取图像。
A = imread(FILENAME,FMT) 读取图像到A,如果文件是包含一灰度图像,A是一二维矩阵,如果文件是包含一真彩色图像(RGB),A是一三维矩阵(M-by-N-by-3)。FILENAME :图像文件名;FMT:图像文件格式;
文件必须在当前目录下,或在Matlab的一路径上。如果 imread不能够找到一名称为FILENAME的文件,那么它将找一名为FILENAME.FMT的文件
= imread(FILENAME,FMT) 把图像FILENAME读入与它相关的图像色彩信息写入MAP,图像色彩信息值在范围中自动地重新调整.
[...] = imread(FILENAME)这种方式是试图得到文件的格式从文件所包含的信息。
[...] = imread(URL,...)从一Internet URL上读图像 URL 必须包含协议(即: "http://").
1.2数据类型:
TIFF的特殊语法:
[...] = imread(...,IDX) 从很多图像TIFF文件中 读一个图像;IDX是一个整数值,它显示了所读图像在文件中的顺序,例如:如果 IDX是 3, imread将读文件中的第三个图像。 如果省略了这个变量, imread将读文件中的第一个图像.
IMREAD支持的图像文件格式:JPEG TIFF GIF BMP PNG HDF PCX XWD ICO CUR RAS PBM PGM PPM
相关信息也可在Matlab中查看: imfinfo, imwrite, imformats, fread,
二:imwrite输出图像
imwrite(A,FILENAME,FMT) 把图像 A 写入图像文件 FILENAME.
imwrite(X,MAP,FILENAME,FMT) 把 X和它的相关色彩信息MAP写入FILENAME.
imwrite(...,FILENAME) 把图像 写入图像文件FILENAME,并推测可能的格式用来做filename的扩展名。扩展名必须是FMT中一合法名.
imwrite(...,PARAM1,VAL1,PARAM2,VAL2,...) 不同的参数控制输出文件的各种不同特征。参数要是当前所支持的HDF,JPEG, TIFF, PNG, PBM, PGM, 和PPM 文件
三:image 显示图像.image(C) 把矩阵 C 转成一图像. C 可以是一MxN 或 MxNx3维的矩阵,且可以是包含 double, uint8,或 uint16 数据.image是用来显示附标图像,即显示的图像上有x,y坐标轴的显示,可以看到图像的像素大小。但可以加上axis off命令即可把坐标去掉。
imshow只是显示图像。用colormap来定义图像显示用的颜色查找表,比如用colormap(pink),可以把黑白图像显示成带粉红色的图像。
图像像素矩阵的数据类型:(1)显示真彩色图像像素三维矩阵X,如果是uint8类型,要求矩阵的数据范围为0-255,(2)如果是double型,则其数据范围为0-1,要不就会出错或者出现空白页。
类型转换:(1)如果你原来的数值是uint8,在运算中转换为double后,实际要显示的数值没有改变的话,只要 用uint8(X)就可转换为uint8型,如果不想转换频繁,也可在显示时用X/255来转换为符合0-1double类型范围要求的数值显示。(2) 如果显示索引图像(二维矩阵),如果索引图像像素数值是double型,则它的取值范围为1-length(colormap),数值起点为1,则矩阵中 数值为1的对应colormap中第一行数据,如果索引图像像素数值是uint8,则取值范围为0-255,数值起点为0,则矩阵中数值为0的对应 colormap中第一行数据,所以索引图像这两个数据类型之间的转换,要考虑到+1或-1。直接用uint8或double转换则会查找移位,产生失真 情况。uint16数据类型与uint8类似,取值范围为0-65536。
四:其它常用图像操作:
图像显示于屏幕有imshow( ), image( )函数;
图像进行裁剪imcrop( );
图像的插值缩放imresize( )函数实现;
旋转用 imrotate( )实现。
回复 沙发 科技在线 的帖子
还是没懂问题出在输入还是输出上呢?应该如何修改? 利用函数imread()可完成图形图像文件的读取,语法:A=imread(filename,fmt)
=imread(filename,fmt)
[...]=imread(filename)
[...]=imread(filename,idx) (只对TIF格式的文件)
[...]=imread(filename,ref) (只对HDF格式的文件)
通常,读取的大多数图像均为8bit,当这些图像加载到内存中时,Matlab就将其存放
在类uint8中。此为Matlab还支持16bit的PNG和TIF图像,当读取这类文件时,Matlab就将
其存贮在uint16中。
注意:对于索引图像,即使图像阵列的本身为类uint8或类uint16,imread函数仍将
颜色映象表读取并存贮到一个双精度的浮点类型的阵列中。 dither 图像抖动,将灰度图变成二值图,或将真彩色图像抖动成索引色图像
gray2ind 将灰度图像转换成索引图像
grayslice 通过设定阈值将灰度图像转换成索引色图像
im2bw 通过设定亮度阈值将真彩色、索引色、灰度图转换成二值图
ind2gray 将索引色图像转换成灰度图像
ind2rgb 将索引色图像转换成真彩色图像
mat2gray 将一个数据矩阵转换成一副灰度图
rgb2gray 将一副真彩色图像转换成灰度图像
rgb2ind 将真彩色图像转换成索引色图像 这只是显示,对其他操作应该没啥影响 楼主可以试试把imshow(I,[])取代imshow(I)
应该就没问题了
回复 7楼 花如月 的帖子
试过了,一样有问题呢:@(
页:
[1]