当前位置: 首页 > news >正文

数字图像处理-空间域图像增强-爆肝18小时用通俗语言进行超详细的总结

目录

灰度变换

直方图(Histogram)

直方图均衡

直方图匹配(规定化)

空间滤波

低通滤波器

高通滤波器
​​​​​​​


本文章讲解数字图像处理空间域图像增强,大部分内容来源于课堂笔记中

灰度变换

图像增强:对图像进行处理,使其更适合于某种特定的应用,有空间域图像增强和变换域图像增强

空间域图像增强是在图像的像素级别进行操作的一种方法。它直接对图像的原始像素值进行处理,常见的空间域增强技术包括直方图均衡化、滤波(如均值滤波、中值滤波)、边缘检测、锐化等

变换域图像增强是在图像变换后进行增强操作的一种技术,它使用数学变换将图像转换到一个不同的域,然后在这个域中对图像进行操作,常见的变换域增强技术包括傅里叶变换、小波变换等,这种处理通常涉及更复杂的数学原理和计算

灰度变换是图像处理中一种常见的操作,其目的是通过对图像的灰度级进行变换,改变图像的对比度、亮度或者强调图像的某些特征。这种变换通常在图像的每个像素上进行,根据像素的原始灰度值应用一个变换函数,得到新的灰度值

通常,灰度变换的一般形式可以表示为:

g(x,y)=T[f(x,y)]

其中,g(x, y)是变换后的图像灰度值,f(x, y)是原始图像的灰度值,T是变换函数

若将邻域大小限制为1*1(上图的邻域为3*3),则简化为:

s=T(r)

r、s分别是f(x,y)、g(x,y)在任意点(x,y)的灰度级

下面介绍一些常见的灰度变换函数

1.图像反转变换

s=-r

效果:灰度图像---“黑白颠倒”  彩色图像---补色

用途:适用于增强图像中暗色区域的灰色细节部分

2.对数变换

s=clog(1+r),c\, \, \, is\, \, \, constant\, \, \, and\, \, \, r\, \, \, is\, \, \, not\, \, \, negative

效果:把窄范围的低灰度级映射到宽范围的灰度级,把宽范围的高灰度级映射到窄范围的高灰度级

应用:压缩图像的动态范围,显示图像的傅里叶频谱图等

3.反对数变换

s=c/log(1+r),c\, \, \, is\, \, \, constant\, \, \, and\, \, \, r\, \, \, is\, \, \, not\, \, \, negative

效果:把宽范围的低灰度级映射到窄范围的灰度级,把窄范围的高灰度级映射到宽范围的高灰度级

4.幂次(伽马)变换

s=cr^{\gamma },c\, \, \, and\, \, \, r\, \, \, are\, \, \,not\, \, \, negative

效果:

\gamma <1 扩展暗像素值,压缩亮像素值,提升暗区分辨能力

\gamma >1 压缩暗像素值,扩展亮像素值,提升亮区分别能力

应用:用于各种图像获取、打印和显示等设备的伽马校正

演示:

一般对于航拍图而言,由于是在空中拍,拍的照片都比较亮,导致整体画面不清晰、观感不舒服,所以可以对其使用\gamma值大于1的幂次变换进行调整

import cv2
import numpy as np# 读取图像
gray_image = cv2.imread('overlooking_img.jpg', cv2.IMREAD_GRAYSCALE)# 检查图像是否成功读取
if gray_image is None:print("Error: Could not read the image.")
else:# 伽马值gamma =  1.8# 进行伽马变换gamma_corrected = np.array(255 * (gray_image / 255) ** gamma, dtype='uint8')# 窗口大小window_size = (300, 200)# 创建原始图像窗口并设置大小cv2.namedWindow('Original Image', cv2.WINDOW_NORMAL)cv2.resizeWindow('Original Image', *window_size)cv2.imshow('Original Image', gray_image)# 创建伽马校正图像窗口并设置大小cv2.namedWindow('Gamma Corrected Image', cv2.WINDOW_NORMAL)cv2.resizeWindow('Gamma Corrected Image', *window_size)cv2.imshow('Gamma Corrected Image', gamma_corrected)cv2.waitKey(0)cv2.destroyAllWindows()

5. 分段线性变换

将灰度级划归不同范围,每个范围采用不同的线性变换

优点:变换形式可根据需要任意合成

缺点:需用户输入

主要形式:1.对比度拉伸2.灰度级分层(灰度切割)3.比特平面分层(位图切割)

直方图(Histogram)

直方图表示具有不同灰度级的像素个数的条形图,把图像的灰度看作一个随机变量,则直方图是描述该随机变量的概率分布的一个近似

如上图所示,左边是普通的直方图、右边的是归一化的直方图

仅仅观察一个图像的直方图就可以看出这个图像的特点,比如说如果直方图的组成成分集中在灰度级低低的一侧,那么就是暗图像,如果直方图窄而且集中在灰度级的中间,那么就是低对比度图像等等

直方图均衡

如果想要增加像素灰度值的动态范围,从而增强图像对比度,可以使用直方图均衡,直方图均衡会使用灰度变换进行灰度修正,使得变换后的图像的直方图的灰度值分布均匀

那么,现在我们就需要找到一个灰度变换函数s=T(r)(注意:这个函数一定是个单调递增函数),将每一个r映射为s,满足:s服从均匀分布

由于r和s的定义域和值域均为[0, L - 1],则可以得到s的概率分布函数:

p_{s}\left ( s \right )=1/\left ( L-1 \right )

再由概率密度函数的基本性质可得:

p_{s}\left ( s \right )ds=p_{r}\left ( r \right )dr

所以有:

ds=p_{r}\left ( r \right )dr/\left ( p_{s}\left ( s \right ) \right )=\left ( L-1 \right )p_{r\left ( r \right )}dr

两边同时做积分,有:

s=T(r)=(L-1)\int_{0}^{r}p_{r}(w)dw

对于M行N列的数字图像,灰度级出现的概率近似为:

p_{r}(r_{k})=n_{k}/(MN),k=0,1,2,...K-1

代入,可以得到灰度变换函数的离散形式

s_{k}=T(r_{k})=(L-1)\sum_{j=0}^{k}p_{j}(r_{j})=(L-1)/(MN)\sum_{j=0}^{k}n_{j},k=0,1,2,...,K-1

总结:直方图均衡化处理的核心是:非线性拉伸,它可以增强图像的对比度但不改变图像内容,但在均衡过程中,原来频数较小的灰度级会被归入很少几个或一个灰度级内造成细节损失,还需要注意的是高对比度图像经直方图均衡化后,质量可能变差

直方图匹配(规定化)

修改一幅图像的直方图,使得它与另一幅图像的直方图相似,从而突出感兴趣的灰度范围,使图像质量改善就是直方图的匹配,如下图所示

上图来源于csdn博主:薯仔的土小豆 《【数字图像处理】直方图规定化(含实现代码)》感谢大佬!

那么我们如何达到上述的效果呢?很简单

假设:r、z分别表示输入图像和输出图像(或者说规定匹配的那个图像)的灰度级

第一步,我们先让r做均衡化,得到s=T(r)    有小数要四舍五入

第二步,我们让z也做均衡化,得到s'=G(z)  有小数要四舍五入

由于直方图匹配不应该改变原始图像内容,所以s=s'

那么我们推出:

z=G^{-1}(s)=G^{-1}(T(r))

第三步,找映射关系,我用下面这个图讲解该如何去找:

比如对于输入图像的一个灰度值r1,我们先得到s1,然后再根据s1=s2得到s2,那么这个s2的横坐标就是输出图像的灰度值z1

空间滤波

使用空间域模板进行的图像处理,称为空域滤波。模板本身被称为空域滤波器
输出图像中的每一点为输入图像中某个相关区域像素集的映射

空间滤波的基础过程:

用上述“空间域模板”在待滤波图像上移动,从蓝到红到绿,依次生成输入值14、13、14

如果说图像f是M*N,滤波器w是m*n,其中m=2a+1,n=2b+1,g(x,y)是图像f经过滤波器w之后在点(x,y)的输出图像,w(s,t)是w在点(s,t)的系数,f(x,y)是原图像在(x,y)上的像素值则易得:

g(x,y)=\sum_{s=-a}^{a}\sum_{t=-b}^{b}w(s,t)f(x+s,y+t)

上式实际上是一个相关操作,还有一个操作叫做卷积,和相关非常相似,但略有不同

下面通过一个例子,直观展示两者的区别:

那么,卷积和相关相比,其优势在哪里?卷积的操作符合交换律、结合律、分配律,而相关仅仅符合分配律

低通滤波器

低通滤波器又称平滑滤波器,它可以去除图像中一些不重要的细节,比如噪声,还可以平滑图像

低通滤波器分为线性滤波器和非线性滤波器,下面细说

线性滤波器主要指均值滤波器,其一般形式如下,分为盒装滤波和加权均值滤波

其中n=a+b+c+...+h+i

如果为盒装滤波,则a=b=c=...=h=i 

如果为加权均值滤波,则a~i至少有两个值不同

非线性滤波器又称统计排序滤波器,一般分为三种:中值滤波器、最大值滤波器、最小值滤波器,这三种滤波器非常好理解,以最大值滤波器为例,输出像素就是原像素滤波范围内所有像素的最大像素值

中值滤波器可以消除孤立的亮点或暗点、有效去除椒盐噪声,同时较均值滤波器而言,更好地保留边的锐度和图像的细节

高通滤波器

高通滤波器又称锐化滤波器,它可以突出图像的细节,在超声探测成像中,可以通过锐化改善分别率低、边缘模糊等问题,同时也可以恢复过度钝化、曝光不足的图像

先简单介绍一下图像中的高频信息和低频信息,低频是指灰度变化比较小的像素区域(图像内容),高频是指灰度变化比较大的像素区域(变化或者内部纹理),而高通滤波器就是要削弱低频信息,突出高频信息,这与上述低通滤波器恰恰相反

高通滤波器当中常见的两种形式是一阶微分和二阶微分

那么,先介绍一下这两种微分的数学形式

一阶微分

\frac{\partial f}{\partial x}=f(x+1)-f(x)

二阶微分

\frac{\partial^2 f}{\partial x^2}=f(x+1)+f(x-1)-2f(x)

使用二阶微分锐化图像一般用拉普拉斯算子,其定义式如下:

\bigtriangledown ^{2}f=\frac{\partial^2 f}{\partial x^2}+\frac{\partial^2f }{\partial y^2}=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)

其中第二个等号后面是代入上述二阶微分算式后求得的偏导结果

根据拉普拉斯算子的定义,容易得到拉普拉斯算子的标准滤波模板

如果对上述的模板进行扩展,使得其能够处理对角线的四个像素,可以得到如下模板:

最后是上面两种模板的另一种形式

下面是使用上述两种模板进行锐化的实例,可以发现:经有对角分量的掩膜处理后的图像,比基本掩膜处理后的图像更加锐化

使用一阶微分锐化图像一般用梯度,其定义式如下:

\bigtriangledown f=[(z_{6}-z_{5})^{2}+(z_{8}-z_{5})^{2}]^{1/2}

用上述的式子很难形成滤波的模板,所以我们采取的方式是用绝对值替换

\bigtriangledown f=[G_{x}^{2}+G_{y}^{2}]^{1/2}\approx |G_x|+|G_y|

形成了下面常用的三种算子

1.Roberts交叉梯度算子

\bigtriangledown f\approx |z_9-z_5|+|z_8-z_6|

2.Prewitt梯度算子

\bigtriangledown f\approx |(z_7+z_8+z_9)-(z_1+z_2+z_3)|+|(z_3+z_6+z_9)-(z_1+z_4+z_7)|

3.Sobel梯度算子

\bigtriangledown f\approx |(z_7+2z_8+z_9)-(z_1+2z_2+z_3)|+|(z_3+2z_6+z_9)-(z_1+2z_4+z_7)|

相关文章:

数字图像处理-空间域图像增强-爆肝18小时用通俗语言进行超详细的总结

目录 灰度变换 直方图&#xff08;Histogram&#xff09; 直方图均衡 直方图匹配&#xff08;规定化&#xff09; 空间滤波 低通滤波器 高通滤波器 ​​​​​​​ 本文章讲解数字图像处理空间域图像增强&#xff0c;大部分内容来源于课堂笔记中 灰度变换 图像增强&…...

【Java】【SQL】DATE_FORMAT函数详解

在实际应用开发中&#xff0c;使用sql语句也属于开发者的一部分&#xff0c;这次来说说DATE_FORMAT函数。 引言&#xff1a;实际上在使用Java开发过程中&#xff0c;有很多业务场景下&#xff0c;都有时间类型的参数参与。前后端进行交互的时候&#xff0c;针对时间类型的格式…...

Pooling方法总结(语音识别)

Pooling layer将变长的frame-level features转换为一个定长的向量。 1. Statistics Pooling 链接&#xff1a;http://danielpovey.com/files/2017_interspeech_embeddings.pdf The default pooling method for x-vector is statistics pooling. The statistics pooling laye…...

Java可变参数(学习推荐版,通俗易懂)

定义 可变参数本质还是一个数组 示例代码 注意事项 1.形参列表中&#xff0c;可变参数只能有一个 2.可变参数必须放在形参列表的最后面 注意是最后面。 name也可以为int类型...

异步编程Promise

文章目录 前言一、关于 Promise 的理解与使用1.相关知识补充区别实例对象和函数对象同步回调异步回调Js中的错误&#xff08;error&#xff09;和错误处理 2.promise是什么 二、Promise 原理三、Promise 封装 Ajax四、async 与 await总结 前言 在项目中&#xff0c;promise的使…...

Centos上的默认文本编辑器vi的操作方法积累

打开一个文本后&#xff0c;常见的操作方法积累如下&#xff1a; 001-进入或退出插入模式的方法 按下 i 进入插入模式。 按下 Esc 退出插入模式。 002-进入命令模式的方法&#xff1a; 按下 Esc 退出插入模式&#xff0c;然后输入冒号:进入命令模式。 003-退出vi编辑器的方…...

海康rtsp拉流,rtmp推流,nginx部署转flv集成

海康rtsp拉流&#xff0c;rtmp推流&#xff0c;nginx部署转flv集成 项目实际使用并测试经正式使用无问题&#xff0c;有问题欢迎评论留言 核心后台java代码&#xff1a; try {// FFmpeg命令String command "ffmpeg -re -i my_video.mp4 -c copy -f flv rtmp://localho…...

【Python百宝箱】时序之美:Python 时间序列探秘与创新

时光漫游&#xff1a;Python 时间序列分析全指南 前言 在数字化时代&#xff0c;时间序列数据扮演着关键的角色&#xff0c;从金融到气象再到生产制造。本文将引导你穿越Python丰富的时间序列分析工具&#xff0c;探索从基础统计到机器学习和深度学习的各个层面。无论你是初学…...

flutter开发实战-第一帧布局完成回调实现

flutter开发实战-第一帧布局完成回调实现 在开发中&#xff0c;我们有时候需要在第一帧布局完成后调用一些相关的方法。这里记录一下是实现过程。 Flutter中有多种不同的Binding&#xff0c;每种Binding都负责不同的功能。下面是Flutter中常见的Binding&#xff1a; 这里简单…...

Windows11编译VTM源码生成Visual Studio 工程

VTM介绍 VTM作为H266/VVC标准的官方参考软件&#xff0c;一直用作H266/VVC标准的研究和迭代。关于H2666/VVC标准的介绍、代码、提案、文档等&#xff0c;可以参考H266/VVC编码标准介绍。 官方代码地址&#xff1a; https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM&…...

[数据结构进阶 C++] 二叉搜索树(BinarySearchTree)的模拟实现

文章目录 1、二叉搜索树1.1 二叉搜索数的概念1.2 二叉搜索树的操作1.2.1 二叉搜索树的查找1.2.2 二叉搜索树的插入1.2.3 二叉搜索树的删除 2、二叉搜索树的应用2.1 K模型2.2 KV模型 3、二叉搜索树的性能分析4、K模型与KV模型完整代码4.1 二叉搜索树的模拟实现&#xff08;K模型…...

PostGIS学习教程十四:更多的空间连接

PostGIS学习教程十四&#xff1a;更多的空间连接 在上一节中&#xff0c;我们看到了ST_Centroid(geometry)和ST_Union([geometry])函数&#xff0c;以及一些简单的示例。在本节中&#xff0c;我们将用它们做一些更详细的事情。 提示&#xff1a;写完文章后&#xff0c;目录可以…...

【爬虫软件】孔夫子二手书采集

项目演示 孔网爬取图书信息 目录结构 [ |-- api-ms-win-core-synch-l1-2-0.dll, |-- api-ms-win-core-sysinfo-l1-1-0.dll, |-- api-ms-win-core-timezone-l1-1-0.dll, |-- api-ms-win-core-util-l1-1-0.dll, |-- api-ms-win-crt-conio-l1-1-0.dll, |-- api…...

P8736 [蓝桥杯 2020 国 B] 游园安排

题目描述 L \mathrm{L} L 星球游乐园非常有趣&#xff0c;吸引着各个星球的游客前来游玩。小蓝是 L \mathrm{L} L 星球 游乐园的管理员。 为了更好的管理游乐园&#xff0c;游乐园要求所有的游客提前预约&#xff0c;小蓝能看到系统上所有预约游客的名字。每个游客的名字由一…...

初识Docker-什么是docker

Docker是一个快速交付应用、运行应用的技术 目录 一、Docker 二、运用场景 一、什么是Docker&#xff1f;它的作用是什么&#xff1f; Docker如何解决大型项目依赖关系复杂&#xff0c;不同组件依赖的兼容性问题? Docker允许开发中将应用、依赖、函数库、配置一起打包&…...

maven的pom.xml设置本地仓库

配置 在Maven项目中&#xff0c;您可以在pom.xml文件中配置本地仓库的路径。在pom.xml文件中&#xff0c;您可以添加以下配置来指定本地仓库的路径&#xff1a; <project>...<repositories><repository><id>local-repo</id><url>file://…...

Qt获取屏幕DPI缩放比

获取屏幕缩放比 网上很多代码是用 logicalDotsPerInch 除以 96 来获取屏幕缩放比&#xff1a; // Windows 除以 96&#xff0c;macOS 除以 72 qreal factor window->screen()->logicalDotsPerInch() / 96.0; 当使能了缩放适配后&#xff0c;logicalDotsPerInch 值就不…...

Spring MVC控制层框架

三、Spring MVC控制层框架 目录 一、SpringMVC简介和体验 1. 介绍2. 主要作用3. 核心组件和调用流程理解4. 快速体验 二、SpringMVC接收数据 1. 访问路径设置2. 接收参数&#xff08;重点&#xff09; 2.1 param 和 json参数比较2.2 param参数接收2.3 路径 参数接收2.4 json参…...

vmware安装银河麒麟V10高级服务器操作系统

vmware安装银河麒麟V10高级服务器操作系统 1、下载银河麒麟V10镜像2、VMware安装银河麒麟V10高级服务器操作系统2.1、新建虚拟机2.2、安装虚拟机 3、配置银河麒麟V10高级服务器操作系统3.1、安装vmware tools3.2、配置静态IP地址 和 dns3.3、查看磁盘分区3.4、查看系统版本 1、…...

掌握Jenknis基础概念

目录 任务&#xff08;Jobs&#xff09; 构建&#xff08;Builds&#xff09; 触发器&#xff08;Triggers&#xff09; 构建环境&#xff08;Build Environment&#xff09;&#xff1a; 插件&#xff08;Plugins&#xff09;&#xff1a; 参数化构建&#xff08;Paramet…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...