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

本文主要是介绍计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 1.点运算
    • (1)What
    • (2)Why
  • 2.灰度变换
    • (1)What
    • (2)Why(作用)
    • (3)Which(有哪些灰度变换)
  • 3.直方图修正
    • (1)直方图均衡化

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:统计每一个灰度级的数量
// 统计输入图像的灰度级数量
std::vector<int> vNk(256, 0);
int iTotal = imDst.total();
for (int i = 0; i < imDst.total(); ++i)
{vNk[imDst.data[i]]++;
}
  • step02:求累积分布
// 求累积分布函数
for (int i = 1; i < 256; ++i)
{vNk[i] = vNk[i] + vNk[i - 1];
}
  • step03:建立映射关系
// 确定映射关系
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]];}}

这篇关于计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1056576

相关文章

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

MySQL 安装配置超完整教程

《MySQL安装配置超完整教程》MySQL是一款广泛使用的开源关系型数据库管理系统(RDBMS),由瑞典MySQLAB公司开发,目前属于Oracle公司旗下产品,:本文主要介绍MySQL安装配置... 目录一、mysql 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL5.1

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Logback在SpringBoot中的详细配置教程

《Logback在SpringBoot中的详细配置教程》SpringBoot默认会加载classpath下的logback-spring.xml(推荐)或logback.xml作为Logback的配置... 目录1. Logback 配置文件2. 基础配置示例3. 关键配置项说明Appender(日志输出器

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢

Kali Linux安装实现教程(亲测有效)

《KaliLinux安装实现教程(亲测有效)》:本文主要介绍KaliLinux安装实现教程(亲测有效),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载二、安装总结一、下载1、点http://www.chinasem.cn击链接 Get Kali | Kal

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red