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>
相关文章推荐
- JAVA顺序表(Sequential List)操作
- Android4.42-Setting源码分析之蓝牙模块Bluetooth(下)
- 使用SOAPUI测试WEBAPI接口
- web UI技术方案备忘
- 能否在非UI线程更新界面呢?
- Hootsuite(互随社交)
- PreferenceActivity 中的 onBuildHeaders() 调用时机
- Hootsuite(互随社交)
- Hootsuite(互随社交)
- leetcode之Repeated DNA Sequences
- Generate a hash from unique ID
- [leetcode] 272. Closest Binary Search Tree Value II 解题报告
- 五种创建UIImage的类方法
- 关于easyUI的combbobox下拉框多选时,后台获取下拉框的值获取的问题
- ios学习总结(2) -- UIButton的使用
- ios学习总结(2) -- UIButton的使用
- UESTC 1271 Search gold
- ios学习总结(2) -- UIButton的使用
- UIViewController - SenDylan
- NGUI实现Sprite裁切成圆形或者椭圆形(不完美)