博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab中uint8,double,im2double和im2uint8的区别
阅读量:2134 次
发布时间:2019-04-30

本文共 2313 字,大约阅读时间需要 7 分钟。

【转载】

原文传送门:https://blog.csdn.net/fx677588/article/details/53301740

1. matlab图像保存说明

matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,好处相比较默认matlab数据类型双精度浮点double(64位,8个字节),自然可以节省很大一部分存储空间。

  详细来说imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。例如,彩色图像像素大小是400300( 高 * 宽 ),则保存的数据矩阵为400300*3,其中每个颜色通道值是处于0~255之间。
  但是虽然matlab中读入图像的数据类型是uint8,而在图像矩阵运算的时候,使用的数据类型却是double类型。一是为了保证精度,二是因为如果不转换,在对uint8进行加减时会产生溢出,可能提示的错误为:

Function ‘*’ is not defined for values of class ‘uint8’

1个字节无符号整型最大只能存储数据为255,对图片的操作所以很容易溢出。

2. matlab图像类型转换

matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,区别如下:

img = imread('./1.jpg'); % 读入是unit8型(0~255)数据I1  = im2double(img);    % 把图像转换成double精度类型(0~1)I2  = double(img)/255;   % uint8转换成double,作用同im2double

这里补充说明一下,im2double( )和double( )的区别。double( img)就是简单的数据类型转换,将无符号整型转换为双精度浮点型double,但是数据大小没有变化,原本数据是0到255之间,转化后还是0到255。例如原来是255,那么转换后为255.0,小数位0个数是由double数据长度决定,实际数据大小还是255,只不过这个255已经是double类型空间存储了,再增加不会发生溢出情况。而im2double(img)则不仅仅是将uint8转换到double类型,而且把数据大小从0到255映射到0到1区间。

  另外需要补充说明下面这种情况:

img = imread('./1.jpg');I1  = double(img);I2  = im2double(I2); % I2数据依然是0~255,并不是0~1,即I1=I2

因为I1已经是double类型,imdouble不会对double类型数据0到255映射到区间0到1,所以上面im2double操作没有任何作用,I1和I2相等。

  总结如下:函数im2double将输入转换成double类型。如果输入是uint8、unit16 或者是二值的logical类型,则函数im2double 将其值归一化到0~1之间,当然就是double类型的了。如果输入本身就是double类型,输出还是double类型,并不进行映射。
  如果已经是double类型的数据需要映射,则进行下面操作即可:

I2 = I1/255;

3. matlab图像显示imshow类型问题

在matlab处理完数据好,我们希望显示或者imwrite写入图片时候,需要注意。如果直接对double之间的数据矩阵I运行imshow(I),我们会发现有时候显示的是一个白色的图像。

  这是因为imshow()显示图像时对double型是认为在0到1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0到255范围。所以对double类型的图像显示的时候,要么归一化到0到1之间,要么将double类型的0~255数据转为uint8类型。解决方法如下:

imshow(I/255);    % 将图像矩阵转化到0-1之间imshow(I,[]);     % 自动调整数据的范围以便于显示inshow(uint8(I)); % 转成uint8

4. uint和double数据转换的深入说明

double和uint8、uint16之间数据转换有下面的函数:

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

当然,当图像数据是double类型的0~1之间,下面两者操作是等价的:

I1=im2uint8(I); I2=uint8(round(I*255));

但是matlab默认double类型图片数据是位于0到1之间的,而uint8是位于0到255。所以如果矩阵数据图像是double类型(0到1之间)可直接im2uint8,这样不仅完成数据类型转换,而且将0到1之间映射为了0到255之间的数据。

  但是如果图像矩阵数据是double类型的0到255,直接im2uint8转换的话,matlab会将大于1的数据都转换为255,0到1之间的数据才会映射到0~255之间整型的数据。例如下面程序:

img64 = [1,2,3,4];I8    = im2uint8(img64); % I8结果为[255 255 255 255]

个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

你可能感兴趣的文章
【LEETCODE】228-Summary Ranges
查看>>
【LEETCODE】27-Remove Element
查看>>
【LEETCODE】66-Plus One
查看>>
【LEETCODE】26-Remove Duplicates from Sorted Array
查看>>
【LEETCODE】118-Pascal's Triangle
查看>>
【LEETCODE】119-Pascal's Triangle II
查看>>
【LEETCODE】88-Merge Sorted Array
查看>>
【LEETCODE】19-Remove Nth Node From End of List
查看>>
【LEETCODE】125-Valid Palindrome
查看>>
【LEETCODE】28-Implement strStr()
查看>>
【LEETCODE】6-ZigZag Conversion
查看>>
【LEETCODE】8-String to Integer (atoi)
查看>>
【LEETCODE】14-Longest Common Prefix
查看>>
【LEETCODE】38-Count and Say
查看>>
【LEETCODE】278-First Bad Version
查看>>
【LEETCODE】303-Range Sum Query - Immutable
查看>>
【LEETCODE】21-Merge Two Sorted Lists
查看>>
【LEETCODE】231-Power of Two
查看>>
【LEETCODE】172-Factorial Trailing Zeroes
查看>>
【LEETCODE】112-Path Sum
查看>>