***目的:***改善图像的质量
应用:
类型:空域处理和频域处理
图像质量退化的原因:
图像增强并不是矫正图像实际退化的过程和因素,而是对图像进行修正
主要目标:
应用:显示、打印、印刷、识别、分析、创艺等
处理:去除噪音、边缘增强、提高对比度、增加亮度、改善颜色效果、改善细微层次等
——通常与改善视觉效果相一致
处理方法:空域运算、变换域运算与处理
灰度变换
——将一个灰度区间映射到另一个灰度区间的变换
作用:使图像动态范围加大,图像对比度扩展,图像清晰,特征明显
应用:亮度调整、对比度拉伸、灰度级切片
分类:线性变换、非线性变换
获取变换函数的方法:固定函数、交互样点插值、直方图
拉伸图像一些灰度细节同时抑制不感兴趣的部分
有选择地对某一灰度值范围进行扩展,其他范围的灰度值则有可能被压缩
与分段线性拉伸的区别:非线性拉伸不是通过在不同灰度值区间选择不同的线性方程来实现对不同灰度值区间的扩展与压缩,而是在整个灰度值范围内采用统一的非线性变换函数,利用函数的数学性质实现对不同灰度值区间的扩展与压缩
方法:对数扩展、指数扩展
一种自动调节图像对比度质量的算法
方法:通过灰度级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),建立等值像素出现的次数与结果图像像素值的关系
算法实现流程:
***实现:***通过调整灰平衡,使偏色区域,恢复成灰色来达到的
判断彩色图像的偏色:
实现算法:
实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tnm8kaui-1604747830806)(C:\Users&Quantty\Desktop\Snipaste_2020-10-04_17-20-04.jpg)]
基本思想:
应用:
实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSmakyJL-1604747830810)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201004195451897.png)]
基本思想:
应用:
实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jp4XlC7J-1604747830813)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201004201724868.png)]
基本思想:
应用:
实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
设计模板系数的原则
模板系数与像素邻域的计算:通过求平均值,解决超出灰度范围问题
注意
模板尺寸越大,图像越模糊,图像细节丢失越多
如果图像处理的目的是去除噪音,那么低通滤波在去除噪音的同时也平滑了边和尖锐的细节
某些情况下,对图像的低通滤波具有增强大尺度特征的作用
用模板区域内像素的中值作为结果值
强迫突出的亮点(暗点)更像它周围的值,以消除孤立的亮点(暗点)
实现步骤:
优点:
实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zr9v0ZYE-1604747830827)(C:\Users&Quantty\AppData\Roaming\Typora\typora-user-images\image-20201018201834531.png)]
模板系数的设计:根据空域中高通冲激响应函数的图形来设计
设计模板系数的原则
滤波器效果分析
注意
高通滤波在增强了边的同时,丢失了图像的层次和亮度
在某些情况下,高通滤波增强小尺度特征
原理:弥补高通滤波的缺陷,在增强边和细节的同时,不丢失原图像的低频成分。
比较高通滤波和高增益滤波
当A=1时,高增益就是高通滤波
当A>1时,原图像的一部分被加到高通中
滤波器扩大因子及模板系数设计
高通及高增益模板尺寸的选定
高增益滤波器效果的分析
一阶微分算法
Roberts交叉梯度算子
∇ f ≈ ∣ z 5 − z 9 ∣ + ∣ z 6 − z 8 ∣ \nabla f \approx|z_5-z_9|+|z_6-z_8| ∇f≈∣z5−z9∣+∣z6−z8∣
梯度计算由两个模板组成,第一个求得梯度的第一项,第二个求得梯度的第二项,然后求和,得到梯度。
实现效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
微分滤波器的分析
直接使用,与高通类似。
两种特殊应用
预 处 理 ⟹ 傅 里 叶 变 换 ⟹ 滤 波 ⟹ 反 变 换 ⟹ 后 处 理 预处理\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 滤波滤去了高频成分,而低频信息基本无损失地通过。
#####理想低通滤波
转换函数:
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表示截止频率点到原点的距离
作用:
分析:经过理想低通滤波处理后,图像大部分能量在圆周内,圆周外将很暗(没有能量)
实现代码:
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低通滤波器
变换函数:
设计截止频率:
分析:
实现代码:
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)]
变换函数:
特性:
实现代码:
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 | 无 | 较轻 | 一般 |
图像中的细节部分与其频率的高频分量相对应,所以高通滤波可以对图像进行锐化处理。高通滤波器与低通滤波器的作用相反,它使高频分量顺利通过,而消弱低频。
图像的边缘、细节主要位于高频部分,而图像的模糊是由于高频成分比较弱产生的。采用高通滤波器可以对图像进行锐化处理,是为了消除模糊,突出边缘。因此采用高通滤波器让高频成分通过,使低频成分削弱,再经逆傅立叶变换得到边缘锐化的图像。
转换函数:
实现代码:
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)]
变换函数:
设计截止频率:
问题:低频成分被严重地消弱了,使图像失去层次
改进措施:
实现代码:
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)⟹ln⟹DFT⟹H(u,v)⟹(DFT)−1⟹exp⟹g(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),它可用不同的可控方法影响傅里叶变换的低频和高频分量。
同态函数:
效果分析:
实现代码:
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(dis2/d2)))+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)]