幂律(伽马)变换公式:,γ取值范围(0,+∞)
对图像做幂律变换处理,当γ取值(0,1)可以将图像较暗的灰度值映射到更大的灰度值,同时较亮部分变化较小;γ取值(1,+∞)可以将较亮部分映射到更低的亮度,而更暗的部分变化较小。
处理彩色图像,只需要将RGB取出,分别进行幂律变换即可。公式中,c可以取值255,r = a/255,a为像素上RGB分量之一,那么整个公式的取值范围为(0,255),不考虑计算过程的四舍五入的话,幂律变换的操作是可逆的。
实现代码如下:
public void gammaTranverse(BufferedImage image, double param) {
for (int i = 0; i < image.getWidth(); i++) {
for (int j = 0; j < image.getHeight(); j++) {
// 将rgb转换为各个值
int rgb = image.getRGB(i, j);
double R = (rgb >> 16) & 0xff;
double G = (rgb >> 8) & 0xff;
double B = rgb & 0xff;
// 进行伽马变换
R = 255 * Math.pow(R / 255, param);
G = 255 * Math.pow(G / 255, param);
B = 255 * Math.pow(B / 255, param);
// 将值转换为rgb
rgb = ((clamp(255) & 0xff) << 24) | ((clamp((int) R) & 0xff) << 16) | ((clamp((int) G) & 0xff) << 8)
| ((clamp((int) B) & 0xff));
image.setRGB(i, j, rgb);
}
}
}
测试结果:
1、原图。这是一张光线暗到几乎很难直接看到地面物体的航拍影像。通过幂律变换进行处理,增强较暗影像。
2、γ取值为0.4,通过幂律变换处理后效果,可以看到影像增强效果非常明显,影像大部分区域由几乎不可见变得可见。
3、这是一幅光线比较强,且受到云雾干扰的影像。
4、γ取值为2处理后效果,影像整体变暗,但对比度更明显,受光线和云雾干扰造成的泛白现象减弱,整体视觉效果有所提升。