不知道大家有没有使用这个函数时,出现结果异常、过曝的情况我在使用时,发现在官方文档中并未声明的细节。
结合开源的程序源码和实验结果发现该函数对矩阵进行处理时,会对参数指明的处理数据以外的内容进行调整,错误使用会导致图像异常过曝。
使用imadjust()
如果只是使用这个函数,不加除了被处理的图像外的其他参数,J = imadjust(I) 将灰度图像 I 中的强度值映射到 J 中的新值。这种情况下,imadjust 对所有像素值中最低的 1% 和最高的 1% 进行饱和处理。从而提高输出图像 J 的对比度。
我们来加上第一个参数,J = imadjust(I,[]),并对低位增强高位抑制
J = imadjust(I) 对高位增强,低位抑制
再添加参数
J = imadjust(I,[low_in high_in],[low_out high_out]) 将 I 中的强度值映射到 J 中的新值,以使 low_in 和 high_in 之间的值映射到 low_out 到 high_out 之间的值。我们把高位投影到低位试试
那么按照这个逻辑,分别进的高位投射到低位(逆序)、低位投射到高位(逆序)的效果叠加起来等同于一次高位投射到低位(逆序)
是这样吗?
第一种的结果显然比第二种的结果要明亮许多,这意味着第一种在叠加时,有些像素中有些数字变大了。为什么会出现这种结果呢?
实际上,adjust在将指定区间映射到对应区间后,还有其他操作。
我们打开工作区,看看矩阵中数字的实际变化情况
1、整体imadjust的数据符合预计,和原图的值相加等于255。
2、高位在进行置换时,不在高位的灰度值也发生了变化。
3、低位变换时,不在低位的同样变换。
可见,在使用imadjust()函数操作原图像的部分区间进行灰度调整时,并不仅仅只对这个区间的灰度进行处理,而完全不管其他区间的灰度,而是将其他部分的灰度值向映射目标区域外的部分也进行了处理,从结果上看,
当我的处理是将0-127的灰度值向128-255投影时,在处理完原图像的0-127部分之后,再将所有的超出127 的部分置为128,然后结束操作。
推广言之,就是处理为 [a,b]向[a1,b1]投影时,先按照投影给出的函数投影(没给出函数时,默认为一条直线),完成后,将原图中所有小于a的灰度值置为a-1,所有大于b的灰度值置为b+1;
分别处理和一次性处理完成会产生差异的原因就在于此
那么如何保证叠加效果预期一致呢?
可以看到,尽管进行了9段的叠加,结果图像中并未出现过曝的问题。解决办法很简单,在进行叠加之前,将所有处理范围外的数字,全都置0,剔除这些影响因素