Matlab里double和uint8对imshow函数的影响

背景

本文介绍double和uint8两种数据类型对imshow函数造成的影响,如果使用不当用imshow函数显示double类型数据时将得到二值化黑白图像的效果。

double和uint8差异

在matlab里imread之后默认是unit8类型的矩阵,即范围为0-255.但是很多图像变化中是需要数据类型为double的,这就需要将unit8通过double()转换即可,经过转换后数字没变,即原来是200则会变成200.0,仅仅是类型发生变化。但是对imshow函数而言,如果数据是double,它会认为图像正常区间是0-1,即0是黑,1是白,而超过1的都会认为是上限值1,即白色. 下面上一个代码:

1
2
3
4
5
6
7
8
9
10
11
12
clc;
path = '/Users/yanzi/Pictures/lena.jpg';
image = imread(path);
gray = rgb2gray(image);
figure, imshow(gray), title('gray');
gray2 = double(gray);
gray2(1:10, 1:10)=0;
figure, imshow(gray2), title('gray2');
gray3 = im2double(gray);
figure, imshow(gray3), title('gray3');

其中gray是原图像,gray2是用double转换的,转换后可以看到它的数值没发生变化:

上面的10*10是为了故意看到效果,设成了0,显示图像如下:

最左边是原始灰度图像,中间是转double之后的,可以看到除了设0的那部分是黑之外,其他全是白的。

im2double

注意到上图最右边的图像,显示也是正常的,它的数值范围是:

可以看到im2double能将0-255范围内的unit8数据转成double类型的0-1范围内的数据,且能显示正常.

互相转换

  1. 假设原始矩阵为uint8矩阵,如果你通过double()转成了double,那么你转回来只需通过uint8()即可。
  2. 如果你通过im2double转成了0-1区间的double,想转回去的话通过im2uint8()就能得到0-255范围的uint8数据.

参考

显示 Gitment 评论