请准确解释这个等式

时间:2015-02-18 15:15:24

标签: image matlab matrix

我有这个等式:

I = (I - min(I(:))) / (max(I(:)) - min(I(:)));

其中I是一个矩阵,我知道min(I(:))max(I(:))分别计算I矩阵的最小和最大元素。

当我创建一个随机矩阵rand(5,5)randi(5,5)时,我在上面的方程式之前和之后都没有看到任何变化:

two muppets

但是当我在灰度图像上实现这个等式时,结果是二进制图像:

two muppets

这里有人能完全解释这个等式吗?

I = (I - min(I(:))) / (max(I(:)) - min(I(:)));

1 个答案:

答案 0 :(得分:8)

代码行

I = (I - min(I(:))) / (max(I(:)) - min(I(:)));

将范围[min(I(:)),max(I(:))]的数据线性转换为范围[0,1] - 它是标准化的一种形式。除法之前的部分移动数据使得最小值变为0.然后除法压缩数据使得最大值变为1.

通过相互映射原始数据和转换数据,您可以了解所发生的事情:

I = randi(100, 1, 10);
plot(I,  (I - min(I(:))) / (max(I(:)) - min(I(:))), '.')
xlabel original
ylabel transformed

偶然地,最小值为5,最大值为75.数据被线性变换,使得最小值映射到0,最大值映射到1。

您没有看到矩阵图的差异可能是由于您绘制它的方式。如果您使用例如imagesc,它在绘图之前在内部进行了这样的转换(因此sc部分用于"缩放")因此您不会看到 a区别。但区别在于,只看数字本身:

示例:

>> I = randi(3, 3, 3)

I =

     1     2     2
     1     2     2
     2     3     3

>> I = (I - min(I(:))) / (max(I(:)) - min(I(:)))

I =

                         0                       0.5                       0.5
                         0                       0.5                       0.5
                       0.5                         1                         1

您使用的灰度图像是来自Matlab的tire.tif,是一个8位图像。如果你把它读入Matlab

I = imread('tire.tif');

你得到一组uint8值:

>> whos I
  Name        Size             Bytes  Class    Attributes

  I         205x232            47560  uint8              

在Matlab中,如果使用这种整数数据类型进行计算,在许多情况下结果也会保持整数。您缩放到[0,1],但该范围内只有两个整数。因此,您将获得一个仅包含0和1值的图像,即二进制图像。通过绘图可以再次显示效果:

plot(I(:),  (I(:) - min(I(:))) / (max(I(:)) - min(I(:))), '.')
xlabel original
ylabel transformed

原始数据是从0到255的整数,它们在0-127范围内映射到0,在128-255范围内映射到1。为避免这种情况,首先将数据转换为浮点数据类型:

I = double(I);

有关整数运算的更多信息,请参阅Matlab documentation