通过点运算,输出图像的每个像素的灰度值仅仅取决于输入图像中相对应像素的灰度值。
点运算的作用:实现图像增强的常用方法之一
灰度变换是一种点运算的具体形式,换句话说,灰度变换是点运算的一种运用
增强对比度,是增强图像的重要手段(途径)和方法
核心:灰度变换函数的不同

确定分段函数的三个k值和b值即可实现分段灰度变换效果。
分段线性灰度变换的效果对参数的选取依赖很高,当参数选取不好的时候,不但无法实现增强图像的效果,还可能变得更加糟糕。为此实现自适应选取成为分段线性灰度变换的关键。目前常用的方法有:自适应最小误差法、多尺度逼近方法
和 恒增强率方法等。
直方图均衡化可实现图像的自动增强,但效果不易控制,得到的是全局增强的结果
// 统计输入图像的灰度级数量
std::vector<int> vNk(256, 0);
int iTotal = imDst.total();
for (int i = 0; i < imDst.total(); ++i)
{
vNk[imDst.data[i]]++;
}
// 求累积分布函数
for (int i = 1; i < 256; ++i)
{
vNk[i] = vNk[i] + vNk[i - 1];
}
// 确定映射关系
std::vector<double> vMPk(256, 0.0);
for (int i = 0; i < 256; ++i)
{
vMPk[i] = 255.0f * (double)vNk[i] / iTotal;
}
// 重新赋值实现均衡化
for (int i = 0; i < iTotal; ++i)
{
imDst.data[i] = vMPk[imDst.data[i]];
}
代码汇总如下(可直接使用):
/* 图像均衡化 */
int ImgEqualize(const cv::Mat& imSrc, cv::Mat& imDst) {
// 对输入的数据进行可靠性判定
if (imSrc.empty()) return -1;
// 对输入图像进行灰度化处理
if (imSrc.channels() == 3)
cv::cvtColor(imSrc, imDst, cv::COLOR_RGB2GRAY);
else imDst = imSrc;
// 统计输入图像的灰度级数量
std::vector<int> vNk(256, 0);
int iTotal = imDst.total();
for (int i = 0; i < imDst.total(); ++i)
{
vNk[imDst.data[i]]++;
}
// 求累积分布函数
for (int i = 1; i < 256; ++i)
{
vNk[i] = vNk[i] + vNk[i - 1];
}
// 确定映射关系
std::vector<double> vMPk(256, 0.0);
for (int i = 0; i < 256; ++i)
{
vMPk[i] = 255.0f * (double)vNk[i] / iTotal;
}
// 重新赋值实现均衡化
for (int i = 0; i < iTotal; ++i)
{
imDst.data[i] = vMPk[imDst.data[i]];
}
}