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

本文主要是介绍数字图像处理-空间域图像增强-爆肝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小时用通俗语言进行超详细的总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525677

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚