相机和图像传感器不仅必须适应场景中的自然对比度,还要管理图像传感器暴露于可用光照水平。在标准相机中,快门和镜头光圈设置用于确保传感器不会接收太多或太少的光线。然而,对于传感器的可用动态范围而言,特定图像中的对比度范围通常太大。因此,在捕获需要较长曝光时间的暗区和需要较短曝光以避免饱和“泛白”的明亮区域之间进行权衡。在许多情况下,两者都不能在相同的图像中有效地完成。
照片拍摄完成后,我们无法改变传感器记录的内容。但是,我们仍然可以采取措施并尝试扩大图像的动态范围以增加其对比度。最常用的技术是直方图均衡化。
直方图均衡化背后的基础数学涉及将一个分布映射到另一个分布。也就是说希望在新分布中尽可能均匀地分布原始分布的值。事实证明,映射函数应该是累积分布函数。可以使用累积分布函数将原始分布重新映射到均匀分布,只需在原始分布中查找每个值并查看均衡分布中应该去的位置。对于连续分布,结果将是精确的均衡,但对于数字化/离散分布,结果可能远不一致。
voidcv::equalizeHist(
constcv::InputArray src, // Input image
cv::OutputArraydst // Result image
);
在equalizeHist()中,源src必须是单通道,8位图像。目标图像dst将是相同的。对于彩色图像,必须将通道分开并逐个处理。关于直方图均衡化的更详细的介绍在之前《图像增强》中。这里就不再详述,给出一个例子看下怎么实现。
例1 直方图均衡化示例
#include
#include
usingnamespace std;
usingnamespace cv;
int main(intargc, char** argv)
{
Mat src = imread("E:/均衡化.jpg",0);
namedWindow("原图",0);
imshow("原图",src);
Mat dst;
equalizeHist(src, dst);
namedWindow("均衡化图",0);
imshow("均衡化图",dst);
waitKey(0);
return 0;
}