声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1720|回复: 7

[综合讨论] [求助]关于matlab的图像显示出现的问题

[复制链接]
发表于 2008-9-4 10:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
已经遇到过几次这种问题了,为什么对于有些图像仅仅运行
I=imread('文件名');
imshow(I);
这么简单的程序,出现的图片显示结果和原始图像的显示效果不一致?有的情况是灰度出现了问题,有的则会出现类似加噪后的情况呢?
例如经典的lenna测试图像,运行后在matlab中显示如下图:
l.bmp
回复
分享到:

使用道具 举报

发表于 2008-9-4 12:23 | 显示全部楼层
因为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的文件
[X,MAP] = imread(FILENAME,FMT) 把图像FILENAME读入与它相关的图像色彩信息写入MAP,图像色彩信息值在范围[0,1]中自动地重新调整.
[...] = 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( )实现。

评分

1

查看全部评分

 楼主| 发表于 2008-9-4 14:26 | 显示全部楼层

回复 沙发 科技在线 的帖子

还是没懂问题出在输入还是输出上呢?应该如何修改?
发表于 2008-9-4 18:26 | 显示全部楼层
利用函数imread()可完成图形图像文件的读取,语法:

     A=imread(filename,fmt)
     [X,map]=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函数仍将
颜色映象表读取并存贮到一个双精度的浮点类型的阵列中。
发表于 2008-9-4 18:26 | 显示全部楼层
dither       图像抖动,将灰度图变成二值图,或将真彩色图像抖动成索引色图像
    gray2ind    将灰度图像转换成索引图像
    grayslice    通过设定阈值将灰度图像转换成索引色图像
     im2bw      通过设定亮度阈值将真彩色、索引色、灰度图转换成二值图
    ind2gray    将索引色图像转换成灰度图像
    ind2rgb      将索引色图像转换成真彩色图像
    mat2gray   将一个数据矩阵转换成一副灰度图
    rgb2gray    将一副真彩色图像转换成灰度图像
    rgb2ind      将真彩色图像转换成索引色图像
发表于 2008-9-4 18:27 | 显示全部楼层
这只是显示,对其他操作应该没啥影响
发表于 2008-9-5 15:24 | 显示全部楼层
楼主可以试试把imshow(I,[])取代imshow(I)

应该就没问题了

评分

1

查看全部评分

 楼主| 发表于 2008-9-10 09:07 | 显示全部楼层

回复 7楼 花如月 的帖子

试过了,一样有问题呢:@(
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 00:04 , Processed in 0.092770 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表