请准确解释这个等式

please explain this equation exactly

我有这个等式:

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

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

当我制作一个随机矩阵 rand(5,5)randi(5,5) 时,我没有看到在实施上述等式之前和之后有任何变化:

但是当我在灰度图像上实现这个方程时,结果是二值图像:

这里有人能准确解释这个等式吗?

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

代码行

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,它在绘图之前在内部进行这样的转换(因此 "scaling" 的 sc 部分),因此您 看不到 差异。不过区别是有的,看数字本身就知道了:

示例:

>> 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

您使用的灰度图像 tire.tif 来自 Matlab,是一个 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