我有这个等式:
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(:)));
答案 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。