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

其他MATLAB数字图像处理的相关内容
MATLAB求图像的均值、中值、众数、方差、协方差、相关系数


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


前言

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


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

一、图像显示问题说明

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-255
imshow(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:r
    	for j=1:c
        	a(i,j)=a(i,j)/(ma-mi);
    	end
	end
	x=a;
	imshow(x);
end

2.函数调用

代码如下(示例):

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

图像可以正常显示了
在这里插入图片描述


总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值