1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MATLAB图像imshow函数显示问题 uint8与double类型转换 自定义图像显示函数

MATLAB图像imshow函数显示问题 uint8与double类型转换 自定义图像显示函数

时间:2019-11-02 00:44:52

相关推荐

MATLAB图像imshow函数显示问题 uint8与double类型转换 自定义图像显示函数

其他MATLAB数字图像处理的相关内容

MATLAB求图像的均值、中值、众数、方差、协方差、相关系数


MATLAB图像imshow函数显示问题、uint8与double类型转换、自定义图像显示函数

前言一、图像显示问题说明1.说明2.案例展示二、图像类型转换三、自定义显示函数1.函数代码2.函数调用总结

前言

在图像处理中,我们需要显示图像来查看效果,所以我对我在显示图像时遇见的一些问题进行了总结。


提示:以下是本篇文章正文内容

一、图像显示问题说明

1.说明

在我对图像进行线性拉伸时,发现将一些图像拉伸到0~255后无法正常显示,通过阅读相关文章终于明白了是什么原因。

MATLAB储存图像时一般会使用uint8类型(1个字节无符号整数,值在0~255之间),使用uint8类型可以起到节省存储空间的作用,但是由于uint8类型在0-255中间,所以在进行算术运算时很容易溢出,我们在进行算数运算前需要把uint8类型转换为double类型。

有一些图像不是以uint8类型储存的,而是直接以double类型储存的,或者我们为了进行运算把uint8类型转换为double类型还没有转换回去,这时如果我们想用imshow() 函数来显示图像就会有一些要求。

当我们使用imshow()函数来显示图像时,如果这个时候的图像矩阵的数据类型是double类型。如果直接运行imshow(img),这时显示的图像可能是一个纯白色的图像。

这是因为imshow()显示图像时,默认double类型的值都在0-1范围内,所以这个时候大于1时都会显示为白色,imshow()显示uint8类型时是0-255范围

如果我们想要double型数据的图像正常显示:①需要把他的范围拉伸到0-1,②或者将范围在0-255之间的double类型数据转换为uint8类型数据,就可以看到正常显示的数据了。

2.案例展示

先读入下面文件

a=imread('原图像.jpg');

可以看到这张图像是以uint8类型储存的

这时候我们直接使用imshow()函数,图像可以正常显示

这时候我们读入另外一张图像(由于过大无法上传)

b=imread('南京.jpg');

可以发现数据的范围在0-1之间,这时我们调用imshow()函数,图也像可以正常显示。

这时候我们把0-1的图像拉伸到0-255(使用的函数是自己写的后面会发出来),然后再使用imshow函数可以发现,图像显示为全白色。

c=xianxinglashen(b,0,255);%将b的范围拉伸到0-255imshow(c);

显示图像,可以发现图像为纯白色


二、图像类型转换

我们通过使用MATLAB自带的函数就可以完成图像类型的转换

a = imread('原图像.jpg'); % 读入unit8类型(值在0~255之间)的数据b = double(a)/255; % 将uint8类型转换成double类型,并且把范围限制在0~1之间c = im2double(a); % 直接把图像转换成double类型并且值在0~1之间,相当用一个函数完成上面的操作

使用double(a)是最普通的数据类型转换,将无符号整型转换为双精度浮点型double,不会改变数据值的大小,原本数据是0-255之间,转化后还是0-255。

使用im2double(img)则除了将uint8转换到double类型外,还会把数据大小从0-255区间映射到0-1区间

其他转换函数

uint8(a); % 将数据类型转成uint8类型im2double(); % 将图像数组转换成double精度类型im2uint8(); % 将图像数组转换成unit8类型 im2uint16(); % 将图像数组转换成unit16类型

同样的,uint8()函数是最普通的数据类型转换,不会改变数据值的大小,会对数字进行自动取整,单独使用时需要注意,double的值是否是0-255;

而如果矩阵数据图像是double类型(并且范围0-1之间),这是使用im2uint8(),不仅可以完成数据类型转换,还将0-1之间的数据映射到0-255之间的数据。

但是这是又有新的问题,如果此时图像矩阵数据是double类型且范围在0-255之间,这是使用im2uint8函数转换,matlab会将大于1的数据都转换为255,所以这时应该使用uint8()函数


三、自定义显示函数

为了适应多种类型图像的显示,我自己写了一个自定义的展示函数来解决问题。

1.函数代码

这里我选择把所有值转换为double类型并且归一化。(如果想处理多个波段根据下面的函数改写即可)

代码如下(示例):

function [ x ] = show1( a )%a为单波段图像的图像矩阵a=double(a);b=a(:);[r,c]=size(a);ma=max(b);mi=min(b);for i=1:rfor j=1:ca(i,j)=a(i,j)/(ma-mi);endendx=a;imshow(x);end

2.函数调用

代码如下(示例):

b=imread('南京.jpg');c=xianxinglashen(b,0,255);show1(c);

图像可以正常显示了


总结

文章中的内容时在完成作业过程中通过各种途径学习到的,还存在很多问题和不足,希望能够逐步完善。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。