Kar*_*ini 0 matlab image matrix
我有这个等式:
I = (I - min(I(:))) / (max(I(:)) - min(I(:)));
Run Code Online (Sandbox Code Playgroud)
在哪里I是矩阵,我知道min(I(:))并分别max(I(:))计算I矩阵的最小和最大元素.
当我做一个随机矩阵rand(5,5)或者randi(5,5)在上面的方程式之前和之后我没有看到任何变化:

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

这里的任何人都能完全解释这个等式吗?
I = (I - min(I(:))) / (max(I(:)) - min(I(:)));
Run Code Online (Sandbox Code Playgroud)
代码行
I = (I - min(I(:))) / (max(I(:)) - min(I(:)));
Run Code Online (Sandbox Code Playgroud)
线性地将范围[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
Run Code Online (Sandbox Code Playgroud)

偶然地,最小值是5并且最大值是75.数据被线性变换,使得最小值被映射到0并且最大值被映射到1.
您没有看到矩阵图的差异可能是由于您绘制它的方式.如果你使用eg imagesc,它会在绘图之前在内部进行这样的转换(因此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
Run Code Online (Sandbox Code Playgroud)
您使用的灰度图像tire.tif来自Matlab,是一个8位图像.如果你把它读成Matlab
I = imread('tire.tif');
Run Code Online (Sandbox Code Playgroud)
你得到一组uint8值:
>> whos I
Name Size Bytes Class Attributes
I 205x232 47560 uint8
Run Code Online (Sandbox Code Playgroud)
在Matlab中,如果使用这种整数数据类型进行计算,在许多情况下结果也会保持整数.您缩放到[0,1],但该范围内只有两个整数.因此,您将获得一个仅包含0和1值的图像,即二进制图像.通过绘图可以再次显示效果:
plot(I(:), (I(:) - min(I(:))) / (max(I(:)) - min(I(:))), '.')
xlabel original
ylabel transformed
Run Code Online (Sandbox Code Playgroud)

原始数据是0到255之间的整数,它们在0-127范围内映射到0,在128-255范围内映射到1.为避免这种情况,首先将数据转换为浮点数据类型:
I = double(I);
Run Code Online (Sandbox Code Playgroud)
有关整数运算的更多信息,请参阅Matlab文档.
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |