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

news2025/2/3 9:55:59

目录

灰度变换

直方图(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)|

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上&#xff0c;并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…

找不到msvcp120dll,无法继续执行代码的解决方法大全

当你尝试启动一个应用程序或游戏&#xff0c;并且遭遇到一个错误信息&#xff0c;告诉你“找不到msvcp120dll,无法继续执行代码”或者收到类似的提示&#xff0c;这说明你的操作系统中缺失了一个关键的动态链接库文件&#xff0c;即 msvcp120.dll。这种情况其实并不罕见&#x…

Java开发框架和中间件面试题(3)

14.Spring事务中的隔离级别有哪几种&#xff1f; 在TransactionDefinition接口中定义了五个表示隔离级别的常量&#xff1a; 1⃣️ISOLATION DEFAULT&#xff1a;使用后端数据库默认的隔离级别&#xff0c;Mysql默认采用的可重复读隔离级别&#xff1b;Oracle默认采用的读已提…

智能优化算法应用:基于金鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金鹰算法4.实验参数设定5.算法结果6.参考文献7.MA…

深入理解 JavaScript 函数:提升编程技能的必备知识(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

python/C 生成beta分布的随机数

python/C 生成beta分布的随机数 文章目录 python/C 生成beta分布的随机数前言一、beta分布理论知识二、python 生成服从beta分布的随机数三、C语言生成服从beta分布的随机数 前言 想把一个算法用C语言实现&#xff0c;其中涉及到了beta分布取随机数&#xff0c;记录一下结果 一…

JOSEF约瑟 零序电流互感器DH-30L DH-70L 配套DJ-ZB1漏电继电器使用

系列型号 DH-16L型配套用零序&#xff08;剩余&#xff09;电流互感器DH-20L型配套用零序&#xff08;剩余&#xff09;电流互感器 DH-23L型配套用零序&#xff08;剩余&#xff09;电流互感器DH-30L型配套用零序&#xff08;剩余&#xff09;电流互感器 DH-45L型配套用零序&am…

【Linux笔记】文件查看和编辑

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 cat (Concatenate and Display): more 和 less: nano 和 vim (文本编辑器): 结语 我的其他博客 前言 学习Linux命令行和文件…

测试框架|Burp Suite几个基本工具的使用

前阵子项目上想通过测试工具在网页上模拟返回错误代码 500 来查看页面的错误处理&#xff0c;然后去调查了下 burp suite&#xff0c;看了些基本工具的使用文档。虽然最后证实 burp suite 只能用来处理页面测试应用程序的实际行为和响应&#xff0c;而不是尝试模拟不存在的问题…

大数据求职心得

........................................................................................................................................................... 大数据求职心得 ...................................................................................…

GCC:GNU编译器

GCC&#xff08;GNU Compiler Collection&#xff09;是一款广泛使用的开源编译器套件&#xff0c;支持多种编程语言&#xff0c;包括C、C、Objective-C、Fortran、Ada和Go等。在本文中&#xff0c;我们将通过一个简单的C程序来介绍GCC的编译过程&#xff0c;包括预处理、编译、…

HrSegNet 23年裂缝检测新文章基于PaddelPaddle和Paddleseg的复现

本文章是对2023年发表在Automation in Construction上论文 Real-time High-Resolution Neural Network with Semantic Guidance for Crack Segmentation 的复现。 我参考了作者上传至github的代码&#xff0c;并得到了作者的帮助。https://github.com/CHDyshli/HrSegNet4Cra…

4G微型RTU如何实现冬季工业管网远程监测

随着我国北方全面进入到冬季&#xff0c;多日以来严寒、降雪天气频发&#xff0c;工业基础设施也迎来冬季考验。对于一些输送化工原料、油气和给排水等用途的工业管网设施&#xff0c;在面临极端冰雪天气时易产生各种风险&#xff0c;诸如管道水/气泄漏损耗、低温冻裂、积雪压塌…

DBdoctor,MySQL 性能问题终结者

本文 5542 字&#xff0c;读完大约需要 8 分钟&#xff08;文末有惊喜 License&#xff01;&#xff09; 17(一起)&#xff0c;这是我的幸运数字&#xff0c;恰巧今年 8 月 17 日在 DTCC 大会上我们全网首次发布 DBdoctor 数据库性能诊断软件&#xff08;简称 DBdoctor&#x…

pake协议传输文件magic-wormhole

pake协议传输文件magic-wormhole 1 magic-wormhole简介其他介绍 2 安装magic-wormhole3 使用示范发送文件指定虫洞码长度 接收文件 1 magic-wormhole简介 16.7k star 强推&#xff0c;丝滑、简洁、安全的开源工具——magic-wormhole 项目地址&#xff1a;https://github.com/…

Debug

0、Debug的步骤 Debug(调试)程序步骤如下&#xff1a; 1、添加断点 2、启动调试 3、单步执行 4、观察变量和执行流程&#xff0c;找到并解决问题 1、添加断点 在源代码文件中&#xff0c;在想要设置断点的代码行的前面的标记行处&#xff0c;单击鼠标左键就可以设置断点&…

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据

1.File&#xff08;操作文件本身&#xff09; 1.定义 目录 2.常用方法 3.路径引用符 可以用/或者\\分隔路径 还可以用File.separator分隔路径&#xff0c;会根据不同系统使用啥分隔符。 4.绝对路径、相对路径及桌面路径表示 桌面路径为&#xff1a; 我电脑的用户名为X 5.示例…

RobotMaster学习——工序导入,参数设置,轨迹生成

目录 引出1.导入工序2.修改刀具其他刀具参数 3.进行工序分配4.设置TCP5.设置工作站6.工序整体导入配置7.进行计算 总结 引出 RobotMaster的操作流程&#xff0c;从导入工序到生产轨迹。 1.导入工序 2.修改刀具 要选择第七把刀具 其他刀具参数 第一把刀具 第二把刀具 第三把刀…

Certum属于企业的泛域名ssl证书

泛域名SSL证书可以保护主域名以及其下所有二级域名&#xff0c;所以也可以叫它通配符SSL证书。Certum旗下有两种泛域名SSL证书&#xff0c;一种是入门级的泛域名SSL证书&#xff0c;支持个人或者企事业单位申请&#xff0c;一种是企业泛域名SSL证书&#xff0c;只能企事业单位申…

Sublime Text 3配置 C# 开发环境

Sublime Text 3配置 C# 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 C#3. 接入 .NET Framework3.1 下载 .NET Framework3.2 环境变量配置 4. 配置 C# 开发环境5. 编写 C# 代码6. 运行 C# 代码 三、总结 一、引言 C# 是一种面向对象的编程语言&#xff0c;由微…