请准确解释这个等式
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。
我有这个等式:
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。