计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换

图像变换:点运算、灰度变换、直方图变换

1.点运算

(1)What

通过点运算,输出图像的每个像素的灰度值仅仅取决于输入图像中相对应像素的灰度值。

(2)Why

点运算的作用:实现图像增强的常用方法之一

2.灰度变换

(1)What

灰度变换是一种点运算的具体形式,换句话说,灰度变换是点运算的一种运用

(2)Why(作用)

增强对比度,是增强图像的重要手段(途径)和方法

  • 改善图像的质量:显示更多细节,进行对比度拉伸
  • 突出感兴趣的特征:针对图像中感兴趣的区域进行突出或抑制

(3)Which(有哪些灰度变换)

核心:灰度变换函数的不同

  • A.线性灰度变换
    y = k * f(x) + b
    当k>1:对比度将增大
    当k<1:对比度将减小
    当k=1,b!=0:图像整体变亮或变暗
    当k=-1,b=255:图像灰度正好相反
    当k<0,b>0:暗区域变亮,亮区域变暗
  • B.分段线性灰度变换

确定分段函数的三个k值和b值即可实现分段灰度变换效果。

分段线性灰度变换的效果对参数的选取依赖很高,当参数选取不好的时候,不但无法实现增强图像的效果,还可能变得更加糟糕。为此实现自适应选取成为分段线性灰度变换的关键。目前常用的方法有:自适应最小误差法多尺度逼近方法

恒增强率方法等。

  • C.非线性变换-对数变换
    g(x) = c * log(1+f(x))
  • D.非线性变换-反对数变换
    g(x) = ( (f(x)+1)^r -1 ) / f(x)
  • E.非线性变换-幂律变换
    g(x) = c*f(x)^alpha

3.直方图修正

(1)直方图均衡化

复制代码
直方图均衡化可实现图像的自动增强,但效果不易控制,得到的是全局增强的结果
  • step01:统计每一个灰度级的数量
cpp 复制代码
// 统计输入图像的灰度级数量
std::vector<int> vNk(256, 0);
int iTotal = imDst.total();
for (int i = 0; i < imDst.total(); ++i)
{
	vNk[imDst.data[i]]++;
}
  • step02:求累积分布
cpp 复制代码
// 求累积分布函数
for (int i = 1; i < 256; ++i)
{
	vNk[i] = vNk[i] + vNk[i - 1];
}
  • step03:建立映射关系
cpp 复制代码
// 确定映射关系
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]];
}

代码汇总如下(可直接使用):

cpp 复制代码
/* 图像均衡化 */
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]];
	}

}
相关推荐
百***35484 分钟前
DeepSeek在情感分析中的细粒度识别
人工智能
Qzkj66617 分钟前
从规则到智能:企业数据分类分级的先进实践与自动化转型
大数据·人工智能·自动化
weixin79893765432...41 分钟前
React + Fastify + DeepSeek 实现一个简单的对话式 AI 应用
人工智能·react.js·fastify
大千AI助手1 小时前
概率单位回归(Probit Regression)详解
人工智能·机器学习·数据挖掘·回归·大千ai助手·概率单位回归·probit回归
狂炫冰美式1 小时前
3天,1人,从0到付费产品:AI时代个人开发者的生存指南
前端·人工智能·后端
LCG元2 小时前
垂直Agent才是未来:详解让大模型"专业对口"的三大核心技术
人工智能
我不是QI2 小时前
周志华《机器学习—西瓜书》二
人工智能·安全·机器学习
操练起来2 小时前
【昇腾CANN训练营·第八期】Ascend C生态兼容:基于PyTorch Adapter的自定义算子注册与自动微分实现
人工智能·pytorch·acl·昇腾·cann
KG_LLM图谱增强大模型3 小时前
[500页电子书]构建自主AI Agent系统的蓝图:谷歌重磅发布智能体设计模式指南
人工智能·大模型·知识图谱·智能体·知识图谱增强大模型·agenticai
声网3 小时前
活动推荐丨「实时互动 × 对话式 AI」主题有奖征文
大数据·人工智能·实时互动