您的位置:首页 > 产品设计 > UI/UE

uint8、double、mat2uint、imhist绘直方图w恩替藐视

2016-03-25 17:41 639 查看

1.问题描述

<span style="font-size:18px;">ImgUS = imread('050.bmp');
Igray = rgb2gray(ImgUS);
Igray = double(Igray);
figure,imshow(Igray ,[]);
figure;imhist(Igray);</span>


图像可以正常显示,但是灰度直方图却无法显示。

2.解答:

2.1 网友的说法:

默认情况下,matlab将图像中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。

2.2 真实的原因:

问题的真正的解释其实应该是这样的。

首先是在数据类型转换时候uint8和im2uint8的区别,uint的操作仅仅是将一个double类型的小数点后面的部分去掉;但是im2uint8是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255,再将所有其他值乘以255。

图像数据在进行计算前要转化为double类型的这样可以保证图像数据运算的精度。很多矩阵的数据也都是double的,要想显示,必须先转换为图像的标准数据格式。如果转换前的数据符合图像数据标准(比如,如果是double则要位于0~1之间,这个是由Matlab中的规定),那么可以直接使用im2uint8。
如果转换前不满足这个分布规律(也就是我们草草的用double强制将uint变成double型),则使用uint8,将其自动切割至0~255(超过255的按255)最好使用mat2gray(这个函数可以把一个double类的任意数组转换成取值范围在[0,1]之间的),将一个矩阵转化为灰度图像的数据格式(double)。另外,可以用isgray判断矩阵是否是一个图像数据矩阵。

3. 关于imhist:

imhist(I)

显示图像I的直方图,图像的灰度数由图像类型指定,如果I为灰度图像,imhist使用一个默认的256值,如果I为二值图像,imhist则使用2值。

修订后的代码:
<span style="font-size:18px;">ImgUS = imread('050.bmp');
Igray = rgb2gray(ImgUS);
Igray = double(Igray);
figure,imshow(Idenoise,[]);
Igray = mat2gray(Igray);%标准化成图像double
figure;imhist(Igray);</span>
或者,一开始就进行uint8向图像标准类型double转换,利用im2double函数
<span style="font-size:18px;">ImgUS = imread('050.bmp');
Igray = rgb2gray(ImgUS);
Igray = im2double(Igray);%标准化成图像double
figure,imshow(Igray);
figure;imhist(Igray );</span>





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: