图像增强

图像增强

***目的:***改善图像的质量

应用:

  • 改善图像的视觉效果
  • 突出图像特征,便于计算机处理

类型:空域处理和频域处理

  • 空域处理:直接对图像处理
  • 频域处理:在图像的某个变化域内,对图像的变换系数进行运算,然后通过逆变换获得图像增强想要的效果

图像质量退化的原因:

  • 对比度问题:对比度局部或全部偏低,影响图像视觉
  • 噪声干扰问题:使图像蒙受干扰和破坏
  • 清晰度下降问题,使图像模糊不清,甚至严重失真

图像增强并不是矫正图像实际退化的过程和因素,而是对图像进行修正

图像增强的定义

主要目标:

  • 通过对图像的处理,使图像比处理前更适合一个特定的应用
  • 突出图像中的“有用”信息,扩大图像中不同物体特征间的差别,为图像信息的识别与提取奠定基础

应用:显示、打印、印刷、识别、分析、创艺等

处理:去除噪音、边缘增强、提高对比度、增加亮度、改善颜色效果、改善细微层次等

​ ——通常与改善视觉效果相一致

处理方法:空域运算、变换域运算与处理

图像增强的空域法

点运算增强——灰度级变换增强

灰度变换

​ ——将一个灰度区间映射到另一个灰度区间的变换

作用:使图像动态范围加大,图像对比度扩展,图像清晰,特征明显

应用:亮度调整、对比度拉伸、灰度级切片

分类:线性变换、非线性变换

获取变换函数的方法:固定函数、交互样点插值、直方图

线性变换

分段线性变换

拉伸图像一些灰度细节同时抑制不感兴趣的部分

非线性变换

​ 有选择地对某一灰度值范围进行扩展,其他范围的灰度值则有可能被压缩

与分段线性拉伸的区别:非线性拉伸不是通过在不同灰度值区间选择不同的线性方程来实现对不同灰度值区间的扩展与压缩,而是在整个灰度值范围内采用统一的非线性变换函数,利用函数的数学性质实现对不同灰度值区间的扩展与压缩

方法:对数扩展、指数扩展

灰度变换的分析

  • 对图像层次有负面影响
  • 原因:由于变换是在有限个灰度级上进行的,因此会造成层次的减少
  • 改进:通过输入较多层次(如> 2 8 2^8 28),保证在图像上进行灰度级变换后,其输出保留足够的层次

直方图增强

直方图均衡化

​ 一种自动调节图像对比度质量的算法

方法:通过灰度级r的概率密度函数 p ( r k ) p(r_k) p(rk),求出灰度变换函数T®

技术要点

公理:直方图 p ( r k ) p(r_k) p(rk),为常数的图像对比度最好

目标:寻找一个灰度变换函数T®,使结果图像的直方图 p ( r k ) p(r_k) p(rk)为一个常数

直方图均衡化处理是以累积分布函数变换法为基础的直方图修正法

思想 :使目标图像的直方图具有平直的直方图,从而改变图像整体偏暗或偏亮、灰度层次不丰富的情况

方法:通过灰度 r r r的概率密度函数 p ( r k ) p(r_k) p(rk)求灰度变换函数 T ( r ) T(r) T(r),建立等值像素出现的次数与结果图像像素值的关系

物理解释
  • 不改变灰度出现的次数,所改变的是出现次数所对应的灰度级。由此不改变图像的信息结构
  • 力图使等长区间内出现的像素数接近相等
  • 直方图均衡化实质上是减少图象的灰度级以换取对比度的加大。在均衡过程中,原来的直方图上频数较小的灰度级被归并为很少几个或一个灰度级内
直方图匹配

算法实现流程:

  1. 求出灰度级变换T
  2. 求出灰度级变换G
  3. 求出逆变换 G − 1 G^{-1} G1
  4. 通过T和 G − 1 G^{-1} G1求出复合变换H
  5. 用H对图像做灰度级变换

彩色图像增强

在RGB模型上增强——彩色增强

***实现:***通过调整灰平衡,使偏色区域,恢复成灰色来达到的

判断彩色图像的偏色:

  • 检查图像的灰平衡(白平衡)情况,即检查在现实中应该是灰色(白色)的物体,在图像中是否是灰色(白色)
  • 检查高饱和度的颜色是否正常,即检查在现实中应该是纯色的物体,在图像中是否有偏色

实现算法:

  1. 在图像中选取两个浅灰或深灰区域
  2. 计算这两个区域的RGB平均值,设为 F 1 = ( R 1 , G 1 , B 1 ) 、 F 2 = ( R 2 , G 2 , B 2 ) F_1=(R_1,G_1,B_1)、F_2=(R_2,G_2,B_2) F1=(R1,G1,B1)F2=(R2,G2,B2)
  3. 以G分量为基准,修改R和B分量使之等于G,由此可构建线性变换[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72c7ZKRD-1604747830801)(C:\Users&Quantty\Desktop\微信图片_20201004174015.jpg)]
  4. 分别对R、G、B图像实施变换[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VrXb8QAV-1604747830804)(C:\Users&Quantty\Desktop\微信图片_20201004175353.jpg)]

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tnm8kaui-1604747830806)(C:\Users&Quantty\Desktop\Snipaste_2020-10-04_17-20-04.jpg)]

在HSI模型上增强

通过色调进行处理

基本思想:

  • 将图像转换到HSI色空间
  • 对指定色调值H进行调整,H’ = H +/- Δh

应用:

  • 改变图像的气氛(如暖色和冷色的气氛变化,早晚气氛的变化)
  • 换色(对指定色调的颜色进行更换)、去色

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSmakyJL-1604747830810)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201004195451897.png)]

通过亮度进行处理

基本思想:

  • 将图像转换到HSI色空间
  • 对指定亮度值I,乘上一个调整量ΔI,I’ = I * ΔI

应用:

  • 对每个象素的亮度分量上乘一个大于1的常量(如1.3),使得图像变得更明亮,提高图像的亮度
  • 对每个象素的亮度分量上乘一个小于1的常量(如0.8),使得图像的亮度降低
  • 有选择地调整图像的亮度,可以以色调、选区作为是否进行亮度处理的根据。例如只对红色调提高亮度。
  • 对亮度分量进行直方图均衡化

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jp4XlC7J-1604747830813)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201004201724868.png)]

通过颜色饱和度进行处理

基本思想:

  • 将图像转换到HSI色空间
  • 对指定亮度值S,乘上一个量ΔS,S’ = S * ΔS

应用:

  • 对每个象素的饱和度分量乘一个大于1的常量(如1.3),使得图像的颜色更为鲜明
  • 对每个象素的饱和度分量乘一个小于1的常量(如0.8),使得图像的颜色的鲜明度降低。
  • 有选择地调整图像的颜色饱和度,可以以色调、选区作为是否进行饱和度处理的根据。例如只对红色调提高饱和度

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJvsu5ds-1604747830815)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201004201907156.png)]

伪彩色图像处理

伪彩色图像:将灰度图像变换成彩色图像

方法:伪彩色变换、密度分割

效果实现:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nrO8AQC-1604747830817)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201004193944739.png)]

空域滤波

空域滤波的基本概念

理论基础——线性系统响应:卷积理论

卷积的冲击响应函数h(x,y)为空域卷积模板

空域滤波:使用空域模板进行图像处理

空域滤波器:模板本身

空域滤波输出图像的每一个像素点是输入图像中某个相关区域像素集的映射(包括规则映射、非规则映射)

在数学形态上,空域滤波器包括线性滤波器(高通、低通、带通)和非线性滤波器(最大值、最小值、中值);在处理效果上,包括平滑滤波器和锐化滤波器

数学形态上

线性滤波器

是线性系统和频域滤波在空域的延伸,公式定义如下:
R = w 1 z 1 + w 2 z 2 + . . . + w n z n R=w_1z_1+w_2z_2+...+w_nz_n R=w1z1+w2z2+...+wnzn
其中 w i w_i wi $ i=1,2,…,n 是 模 板 系 数 , 是模板系数, z_i$ $ i=1,2,…,n $是被计算像素及其领域像素的值

线性滤波器的分类

低通滤波器:平滑图像、去除噪音

高通滤波器:边缘增强、边缘提取

带通滤波器:删除特定频率、图像增强中很少用

非线性滤波器

使用模板进行结果像素值的计算,结果值直接取决于像素领域的值

分类

中值滤波

用途:平滑图像、去除噪音

公式:

最大值滤波

用途:寻找最亮点

公式:

最小值滤波

用途:寻找最暗点

公式:

最大值最小值滤波实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ggW72eob-1604747830819)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018201948478.png)]

处理效果上

平滑滤波器
平滑滤波器的用途
  • 对大图像处理前,删去无用的细小细节
  • 连接中断的线段和曲线
  • 降低噪音
  • 平滑处理,恢复过分锐化的图像
  • 图像创艺(阴影、软边、朦胧效果)
基本低通滤波

模板系数的设计:根据空域中低通冲激响应函数的图形来设计,例如可选高斯函数作为冲激函数

几种简单的低通滤波器

均值滤波器——局部平均法

待处理像素点的值等于其周围相邻像素的全体像素的平均值

从线性系统角度,均值滤波冲激响应函数为一个矩形

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQLGYZXQ-1604747830821)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018201356639.png)]

加权平均滤波器

待处理像素点的值等于周围相邻像素的全体像素的加权平均值

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xleu0LaP-1604747830824)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018201603524.png)]

设计模板系数的原则

  1. 大于0
  2. 都选1,或中间选1,周围选0.5

模板系数与像素邻域的计算:通过求平均值,解决超出灰度范围问题

注意

模板尺寸越大,图像越模糊,图像细节丢失越多

如果图像处理的目的是去除噪音,那么低通滤波在去除噪音的同时也平滑了边和尖锐的细节

某些情况下,对图像的低通滤波具有增强大尺度特征的作用

中值滤波

用模板区域内像素的中值作为结果值

强迫突出的亮点(暗点)更像它周围的值,以消除孤立的亮点(暗点)

实现步骤:

  1. 将模板区域内的像素排序,求出中值
  2. 对于同值像素,连续排列后取中值

优点:

  • 抑制噪声
  • 在去除噪音的同时,可以比较好的保留边缘轮廓信息和图像的细节

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zr9v0ZYE-1604747830827)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018201834531.png)]

锐化滤波器
锐化滤波器的用途
  • 加强图像中景物的边缘和轮廓
  • 印刷中的细微层次强调。弥补扫描、挂网对图像的平滑
  • 超声探测成象,分辨率低,边缘模糊,通过锐化来改善
  • 图像识别中,分割前的边缘提取
  • 锐化处理恢复过度平滑、暴光不足的图像
  • 图像创艺(只剩下边界的特殊图像)
  • 尖端武器的目标识别、定位
基本高通滤波

模板系数的设计:根据空域中高通冲激响应函数的图形来设计

设计模板系数的原则

  1. 中心系数为正值,外围为负值
  2. 系数之和为0

滤波器效果分析

  • 常数或变化平缓的区域,结果为0或很小,图像很暗,亮度被降低了
  • 在暗的背景上边缘被增强了
  • 图像的整体对比度降低了
  • 计算时会出现负值,归0处理为常见

注意

高通滤波在增强了边的同时,丢失了图像的层次和亮度

在某些情况下,高通滤波增强小尺度特征

高增益滤波

原理:弥补高通滤波的缺陷,在增强边和细节的同时,不丢失原图像的低频成分。

比较高通滤波和高增益滤波

  • 高通滤波:高通=原图-低通
  • 高增益滤波:高增益=扩大因子A*原图-低通=(A-1)原图+高通

当A=1时,高增益就是高通滤波

当A>1时,原图像的一部分被加到高通中

滤波器扩大因子及模板系数设计

  • 对于3*3模板,A的值决定了滤波器的特性
  • 当A=1.1时,意味着把0.1个原图像加到基本高通上

高通及高增益模板尺寸的选定

  • 理论上,高通和高增益的模板尺寸可为任意尺寸
  • 高通滤波模板很少大于3*3

高增益滤波器效果的分析

  • 相比高通,既增强了边,又保留了层次
  • 噪音对结果图像的视觉效果有重要的影响,高增益在增强了边的同时也增强了噪音
微分滤波器

一阶微分算法

Roberts交叉梯度算子
∇ f ≈ ∣ z 5 − z 9 ∣ + ∣ z 6 − z 8 ∣ \nabla f \approx|z_5-z_9|+|z_6-z_8| fz5z9+z6z8
梯度计算由两个模板组成,第一个求得梯度的第一项,第二个求得梯度的第二项,然后求和,得到梯度。

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fZ8fNz1-1604747830829)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018202636991.png)]

Prewitt梯度算子——3x3的梯度模板
∇ f ≈ ∣ ( z 7 + z 8 + z 9 ) − ( z 1 + z 2 + z 3 ) ∣ + ∣ ( z 3 + z 6 + z 9 ) − ( z 1 + z 4 + z 7 ) ∣ \nabla 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)| f(z7+z8+z9)(z1+z2+z3)+(z3+z6+z9)(z1+z4+z7)
Sobel梯度算子——3x3的梯度模板
∇ f ≈ ∣ ( z 7 + 2 z 8 + z 9 ) − ( z 1 + 2 z 2 + z 3 ) ∣ + ∣ ( z 3 + 2 z 6 + z 9 ) − ( z 1 + 2 z 4 + z 7 ) ∣ \nabla 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)| f(z7+2z8+z9)(z1+2z2+z3)+(z3+2z6+z9)(z1+2z4+z7)
实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aGPmxs1w-1604747830831)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018202607630.png)]

二阶微分算法——拉普拉斯算子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QXEqAuBm-1604747830834)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018183158011.png)]

标准拉普拉斯算子对干扰噪声很敏感,需加以改进。可以先平滑后增强

实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FAZdqoJK-1604747830836)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018202535945.png)]

微分滤波器的分析

直接使用,与高通类似。

两种特殊应用

  • 梯度>25的赋最大值255,否则赋原值。边被突出,背景保留
  • 梯度>25的赋最大值255,否则赋0。边被突出,图被二值化

频域滤波

频域滤波的原理

预 处 理 ⟹ 傅 里 叶 变 换 ⟹ 滤 波 ⟹ 反 变 换 ⟹ 后 处 理 预处理\Longrightarrow傅里叶变换\Longrightarrow滤波\Longrightarrow反变换\Longrightarrow后处理

  • 在傅里叶变换域,变换系数反映了图像在空域难以定义的某些特征
  • 构造一个滤波器,刻意地提升某些频率分量、压低或去除另一些分量,从而达到图像增强的目的
  • 空域滤波基本上借助于模板运算实现,难于实现真正意义上的线性系统滤波
  • 在实际应用中空域模板的尺寸难以扩大,使滤波增强所需信息局限在较小的局部区域,难以获得更为理想的结果和处理较为复杂的杂波去除、多特征增强等

频域滤波

低通滤波

图像在传递过程中,由于噪声主要集中在高频部分,为去除噪声改善图像质量,滤波器采用低通滤波器H(u,v)来抑制高频成分,通过低频成分,然后再进行逆傅立叶变换获得滤波图像,就可达到平滑图像的目的。在傅里叶变换域中,变换系数能反映某些图像的特征,如频谱的直流分量对应于图像的平均亮度,噪声对应于频率较高的区域,图像实体位于频率较低的区域等,因此频域常被用于图像增强。在图像增强中构造低通滤波器,使低频分量能够顺利通过,高频分量有效地阻止,即可滤除该领域内噪声。由卷积定理,低通滤波器数学表达式为:
G ( u , v ) = F ( u , v ) H ( u , v ) G(u,v) = F(u,v)H(u,v) G(u,v)=F(u,v)H(u,v)
式中,F(u,v)为含有噪声的原图像的傅里叶变换域;H(u,v)为传递函数;G(u,v)为经低通滤波后输出图像的傅里叶变换。假定噪声和信号成分在频率上可分离,且噪声表现为高频成分。H 滤波滤去了高频成分,而低频信息基本无损失地通过。

#####理想低通滤波

转换函数:1

D ( u , v ) = ( u 2 + v 2 ) 1 / 2 表 示 点 ( u , v ) 到 原 点 的 距 离 , D 0 表 示 截 止 频 率 点 到 原 点 的 距 离 D(u,v)=(u2+v2)1/2 表示点(u,v)到原点的距离,D_0 表示截止频率点到原点的距离 D(u,v)=(u2+v2)1/2(u,v)D0

作用:

  • D 0 D_0 D0半径内的频率分量无损通过
  • 圆外的频率分量会被滤除
  • 若滤除的高频分量中含有大量的边缘信息,会发生图像边缘模糊现象

分析:经过理想低通滤波处理后,图像大部分能量在圆周内,圆周外将很暗(没有能量)

实现代码:

from matplotlib import pyplot as plt
import numpy as np
import cv2
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

D = 10
img = cv2.imread('C:/Users/&Quantty/Desktop/photo/t1.tif',1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 傅里叶变换
f1 = np.fft.fft2(img)
# 使用np.fft.fftshift()函数实现平移,让直流分量输出图像的重心
f1_shift = np.fft.fftshift(f1)
# 实现理想低通滤波器
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)  # 计算频谱中心
mask = np.zeros((rows, cols), dtype='uint8')  # 生成rows行,从cols列的矩阵,数据格式为uint8
# 将距离频谱中心距离小于D的低通信息部分设置为1,属于低通滤波
for i in range(rows):
    for j in range(cols):
        if np.sqrt(i * i + j * j) <= D:
            mask[crow - D:crow + D, ccol - D:ccol + D] = 1
f1_shift = f1_shift * mask
# 傅里叶逆变换
f_ishift = np.fft.ifftshift(f1_shift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
img_back = (img_back - np.amin(img_back)) / (np.amax(img_back) - np.amin(img_back))

plt.subplot(121);plt.imshow(img, cmap='gray');plt.title('原始图像')
plt.subplot(122);plt.imshow(img_back, cmap='gray');plt.title('D0=10滤波后的图像')

plt.show()

实现效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7oGl6G0f-1604747830838)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201101165408481.png)]

#####Butterworth低通滤波器

变换函数:2

设计截止频率:

  1. 变换函数中不存在一个不连续点作为一个通过的和被滤波掉的截止频率的明显划分
  2. 通常把H(u,v)开始小于其最大值的一定比例的点当作其截止频率点
  3. 有两种选择:3

分析

  • 在任何经BLPF处理过的图像中都没有明显的振铃效果,这是滤波器在低频和高频之间平滑过渡的结果
  • 和理想圆形低通滤波器相比,没有明显的跳跃、模糊程度减少、尾部含有较多的高频,对噪声的平滑效果不如ILPF

实现代码:

from matplotlib import pyplot as plt
import numpy as np
import cv2

img = cv2.imread('C:/Users/&Quantty/Desktop/photo/t1.tif',1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 取绝对值后将复数变化为实数
# 取对数的目的是将数据变换到0~255
s1 = np.log(np.abs(fshift))

def ButterworthPassFilter(image, d, n):
    """
    Butterworth低通滤波器
    """
    f = np.fft.fft2(image)
    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):
        transform_matrix = np.zeros(image.shape)
        center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))
        for i in range(transform_matrix.shape[0]):
            for j in range(transform_matrix.shape[1]):
                def cal_distance(pa, pb):
                    from math import sqrt
                    dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
                    return dis

                dis = cal_distance(center_point, (i, j))
                transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))
        return transform_matrix

    d_matrix = make_transform_matrix(d)
    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))
    return new_img

butter_100_1 = ButterworthPassFilter(img, 100, 1)
butter_30_1 = ButterworthPassFilter(img, 30, 1)
butter_30_5 = ButterworthPassFilter(img, 30, 5)

plt.subplot(221);plt.axis('off');plt.title('Original');plt.imshow(img, cmap='gray')
plt.subplot(222);plt.axis('off');plt.title('D=100 n=1');plt.imshow(butter_100_1, cmap='gray')
plt.subplot(223);plt.axis('off');plt.title('D=30 n=1');plt.imshow(butter_30_1, cmap='gray')
plt.subplot(224);plt.axis('off');plt.title('D=30 n=5');plt.imshow(butter_30_5, cmap='gray')

plt.show()

实现效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBGD5T0d-1604747830841)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201101171253774.png)]

高斯低通滤波

变换函数:4

特性

  • 结果图像的清晰度优于ILBF,噪声滤波好于BLBF
  • 振铃效应好于ILBF,差于BLBF

实现代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('C:/Users/&Quantty/Desktop/photo/t1.tif',1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))

def GaussianLowFilter(image,d):
    f = np.fft.fft2(image)
    fshift = np.fft.fftshift(f)
    def make_transform_matrix(d):
        transfor_matrix = np.zeros(image.shape)
        center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
        for i in range(transfor_matrix.shape[0]):
            for j in range(transfor_matrix.shape[1]):
                def cal_distance(pa,pb):
                    from math import sqrt
                    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
                    return dis
                dis = cal_distance(center_point,(i,j))
                transfor_matrix[i,j] = np.exp(-(dis**2)/(2*(d**2)))
        return transfor_matrix
    d_matrix = make_transform_matrix(d)
    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
    return new_img

img_d1 = GaussianLowFilter(img,10)
img_d2 = GaussianLowFilter(img,30)
img_d3 = GaussianLowFilter(img,50)

plt.subplot(221);plt.axis("off");plt.imshow(img,cmap="gray");plt.title('Original')
plt.subplot(222);plt.axis("off");plt.imshow(img_d1,cmap="gray");plt.title('D=10')
plt.subplot(223);plt.axis("off");plt.title('D=30');plt.imshow(img_d2,cmap="gray")
plt.subplot(224);plt.axis("off");plt.title("D=50");plt.imshow(img_d3,cmap="gray")

plt.show()

实现效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HHa5jVak-1604747830845)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201101174849934.png)]

三种滤波器的比较
类别 振铃效果 图像模糊程度 噪声平滑效果
ILPF 严重 严重 最好
BLPF 低阶很轻,高阶明显 很轻 一般
GLPF 较轻 一般

高通滤波

图像中的细节部分与其频率的高频分量相对应,所以高通滤波可以对图像进行锐化处理。高通滤波器与低通滤波器的作用相反,它使高频分量顺利通过,而消弱低频。

图像的边缘、细节主要位于高频部分,而图像的模糊是由于高频成分比较弱产生的。采用高通滤波器可以对图像进行锐化处理,是为了消除模糊,突出边缘。因此采用高通滤波器让高频成分通过,使低频成分削弱,再经逆傅立叶变换得到边缘锐化的图像。

理想高通滤波器

转换函数:5

实现代码:

from matplotlib import pyplot as plt
import numpy as np
import cv2

D = 60
img = cv2.imread('C:/Users/&Quantty/Desktop/photo/t1.tif',1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# numpy 中的傅里叶变换
f1 = np.fft.fft2(img)
f1_shift = np.fft.fftshift(f1)

rows, cols = img.shape
# 计算频谱中心
crow, ccol = int(rows / 2), int(cols / 2)
# 生成rows,cols列的矩阵,数据格式为uint8
mask = np.zeros((rows, cols), dtype='uint8')
# 将距离频谱中心距离小于D的低通信息部分设置为1,属于低通滤波
for i in range(rows):
    for j in range(cols):
        if np.sqrt(i * i + j * j) <= D:
            mask[crow - D:crow + D, ccol - D:ccol + D] = 1

mask = 1 - mask
f1_shift = f1_shift * mask

# 傅里叶逆变换
f_ishift = np.fft.ifftshift(f1_shift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
img_back = (img_back - np.amin(img_back)) / (np.amax(img_back) - np.amin(img_back))

plt.figure();plt.subplot(121);plt.axis('off');plt.imshow(img, cmap='gray');plt.title('Original')
plt.subplot(122);plt.axis('off');plt.imshow(img_back, cmap='gray');plt.title('IHPF')

plt.show()

实现效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K7EkvvsB-1604747830845)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201101184350737.png)]

Butterworth高通滤波

变换函数:6

设计截止频率:

  1. 变换函数中不存在一个不连续点作为一个通过的和被滤波掉的截止频率的明显划分
  2. 通常把H(u,v)开始小于其最大值的一定比例的点当作其截止频率点
  3. 有两种选择:7

问题:低频成分被严重地消弱了,使图像失去层次

改进措施

  • 加一个常数到变换函数H(u,v) + A(高频增强滤波)
  • 为了解决变暗的趋势,在变换结果图像上再进行一次直方图均衡化(后滤波处理)

实现代码:

from matplotlib import pyplot as plt
import numpy as np
import cv2

img = cv2.imread('C:/Users/&Quantty/Desktop/photo/t1.tif',1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 取绝对值后将复数变化为实数
# 取对数的目的是将数据变换到0~255
s1 = np.log(np.abs(fshift))

def ButterworthPassFilter(image, d, n):
    """
    Butterworth 高通滤波器
    """
    f = np.fft.fft2(image)
    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):
        transform_matrix = np.zeros(image.shape)
        center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))
        for i in range(transform_matrix.shape[0]):
            for j in range(transform_matrix.shape[1]):
                def cal_distance(pa, pb):
                    from math import sqrt
                    dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
                    return dis

                dis = cal_distance(center_point, (i, j))
                transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))
        return transform_matrix

    d_matrix = make_transform_matrix(d)
    d_matrix = 1 - d_matrix
    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))
    return new_img

butter_100_1 = ButterworthPassFilter(img, 100, 1)
butter_30_1 = ButterworthPassFilter(img, 30, 1)
butter_30_5 = ButterworthPassFilter(img, 30, 5)

plt.subplot(221);plt.axis('off');plt.title('Original');plt.imshow(img, cmap='gray')
plt.subplot(222);plt.axis('off');plt.title('D=100 n=1');plt.imshow(butter_100_1, cmap='gray')
plt.subplot(223);plt.axis('off');plt.title('D=30 n=1');plt.imshow(butter_30_1, cmap='gray')
plt.subplot(224);plt.axis('off');plt.title('D=30 n=5');plt.imshow(butter_30_5, cmap='gray')

plt.show()

实现效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcytXqUc-1604747830847)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201101185316369.png)]

高频增强滤波(对比)实现代码:

from matplotlib import pyplot as plt
import numpy as np
import cv2
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

img = cv2.imread('C:/Users/&Quantty/Desktop/photo/t2.tif',1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))

def GaussianHighFilter(image,d,flag=None):
    f = np.fft.fft2(image)
    fshift = np.fft.fftshift(f)
    def make_transform_matrix(d):
        transfor_matrix = np.zeros(image.shape)
        center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
        for i in range(transfor_matrix.shape[0]):
            for j in range(transfor_matrix.shape[1]):
                def cal_distance(pa,pb):
                    from math import sqrt
                    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
                    return dis
                dis = cal_distance(center_point,(i,j))
                if flag == 0:
                    transfor_matrix[i,j] =0.5+0.75*(1-np.exp(-(dis**2)/(2*(d**2))))
                else:
                    transfor_matrix[i, j] = 1 - np.exp(-(dis ** 2) / (2 * (d ** 2)))
        return transfor_matrix
    d_matrix = make_transform_matrix(d)
    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
    return new_img

img_d1 = GaussianHighFilter(img,40,1)
img_d2 = GaussianHighFilter(img,40,0)
img_d3 = GaussianHighFilter(img,40,0)
img_d3 = img_d3.astype(np.uint8)
"""
因为进过傅里叶变换图像的像素变成了浮点型,但是直方图均衡
函数的输入数据为整形,所以需要进行数据类型转换
"""
img_d3 = cv2.equalizeHist(img_d3)

plt.subplot(221);plt.axis('off');plt.imshow(img,cmap="gray");plt.title("原始图像")
plt.subplot(222);plt.axis('off');plt.imshow(img_d1,cmap="gray");plt.title('使用高斯高通滤波')
plt.subplot(223);plt.axis('off');plt.imshow(img_d2,cmap="gray");plt.title('使用高频强调滤波')
plt.subplot(224);plt.axis('off');plt.imshow(img_d3,cmap="gray");plt.title('直方图均衡')

plt.show()

实现效果(几种滤波对比):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOpaJyUm-1604747830849)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201101191733378.png)]

同态滤波

在生活中会得到这样的图像,动态范围很大,感兴趣的部分的灰度却很暗,范围很小,灰度层次和细节没有办法辨认,用一般的灰度线性变换法是不行的,因为扩展灰度级虽可以提高物体图像的 因为扩展灰度级虽可以提高物体图像的反差,但会使动态范围变大。而压缩灰 反差,但会使动态范围变大。而压缩灰度级,虽可以减少动态范围,但物体灰 度级,虽可以减少动态范围,但物体灰度层次和细节就会更看不清。 度层次和细节就会更看不.这时我们需要采用同态滤波。同态滤波是一种在频域中同时将图像亮度范围进行压缩和将图像对比度进行增强的方法。

**原理:**将像元灰度值看作是照度和反射率两个组份的产物。由于照度相对变化很小,可以看作是图像的低频成份,而反射率则是高频成份。通过分别处理照度和反射率对像元灰度值的影响,达到揭示阴影区细节特征的目的。

处理流程
f ( x , y ) ⟹ l n ⟹ D F T ⟹ H ( u , v ) ⟹ ( D F T ) − 1 ⟹ e x p ⟹ g ( x , y ) f(x,y)\Longrightarrow ln\Longrightarrow DFT\Longrightarrow H(u,v)\Longrightarrow (DFT)^{-1}\Longrightarrow exp\Longrightarrow g(x,y) f(x,y)lnDFTH(u,v)(DFT)1expg(x,y)
其中 f ( x , y ) f(x,y) f(x,y)为原始图像,ln为对数变换,DFT为傅里叶变换,H(u,v)为频域滤波, ( D F T ) − 1 ( D F T ) ^{− 1} (DFT)1为傅里叶逆变换,exp为指数运算,g(x,y)为输出图像。

图片的照射分量通常由慢的空间变化来表征,而反射分量往往引起突变,特变是在不同物体的连接部分。这些特性导致图像取对数后的傅里叶变换的低频成分与照射相联系,而高频成分与反射相联系。虽然这些联系知识粗略的近似,但它们用在图像滤波中是有益的。

使用同态滤波器可更好地控制照射分量和反射分量,这种控制需要指定一个滤波器函数H(u,v),它可用不同的可控方法影响傅里叶变换的低频和高频分量。

同态函数:8

效果分析:

  • 图像的明度分量的特点是平缓的空域变化,而反射分量则近于陡峭的空域变化
  • 这些特性使得将图像的对数的傅立叶变换的低频部分对应于明度分量,而高频部分对应于反射分量
  • 尽管这种对应关系只是一个粗略的近似,但它们可以用于优化图像的增强操作
  • 一个好的控制可以通过用同态滤波器对明度和反射分量分别操作来得到
  • 这个控制要求指定一个滤波器函数H(u,v),它对于傅立叶变换的低频和高频部分的影响是不同的

实现代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

img = cv2.imread('C:/Users/&Quantty/Desktop/photo/t3.tif',1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))

def Homomorphic(image,d,L,H,c):
    f = np.fft.fft2(image)
    fshift = np.fft.fftshift(f)
    def make_transform_matrix(d,L,H,c):
        transfor_matrix = np.zeros(image.shape)
        center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
        for i in range(transfor_matrix.shape[0]):
            for j in range(transfor_matrix.shape[1]):
                def cal_distance(pa,pb):
                    from math import sqrt
                    dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
                    return dis
                dis = cal_distance(center_point,(i,j))
                transfor_matrix[i,j] = (H-L)*(1-np.exp(-c*(dis**2/d**2)))+L
        return transfor_matrix
    d_matrix = make_transform_matrix(d,L,H,c)
    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
    return new_img
img_d1 = Homomorphic(img,80,0.25,2,1)

plt.subplot(121);plt.axis('off');plt.title('原始图像');plt.imshow(img,cmap="gray")
plt.subplot(122);plt.axis('off');plt.title('同态滤波');plt.imshow(img_d1,cmap="gray")

plt.show()

实现效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zvZppIfd-1604747830852)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201101193134208.png)]

oint = tuple(map(lambda x:(x-1)/2,s1.shape))
for i in range(transfor_matrix.shape[0]):
for j in range(transfor_matrix.shape[1]):
def cal_distance(pa,pb):
from math import sqrt
dis = sqrt((pa[0]-pb[0])2+(pa[1]-pb[1])2)
return dis
dis = cal_distance(center_point,(i,j))
transfor_matrix[i,j] = (H-L)(1-np.exp(-c(dis
2/d
2)))+L
return transfor_matrix
d_matrix = make_transform_matrix(d,L,H,c)
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
return new_img
img_d1 = Homomorphic(img,80,0.25,2,1)

plt.subplot(121);plt.axis(‘off’);plt.title(‘原始图像’);plt.imshow(img,cmap=“gray”)
plt.subplot(122);plt.axis(‘off’);plt.title(‘同态滤波’);plt.imshow(img_d1,cmap=“gray”)

plt.show()


实现效果:

[外链图片转存中...(img-zvZppIfd-1604747830852)]



你可能感兴趣的:(笔记)