【OpenCV 例程 300 篇】105. 湍流模糊退化模型
专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』
【第 7 章:图像复原与重建】
104. 运动模糊退化模型
105. 湍流模糊退化模型
【youcans 的 OpenCV 例程300 篇】105. 湍流模糊退化模型
5.3 模型法估计退化函数
估计图像复原中所用的退化函数,主要有三种方法:观察法、试验法和数学建模方法。
分析导致退化的原因,根据基本原理提出退化模型,如湍流导致的模糊、匀速运动导致的模糊,可以基于模型更加准确地估计退化函数。
下面以运动模糊和大气湍流模型为例,采用退化模型对图像的退化建模。
例程 9.19:湍流模糊退化模型
湍流是自然界中普遍存在的一种复杂的流动现象。物体通过湍流大气成像时,受到湍流效应的影响,出现光强闪烁、光束方向漂移、光束宽度扩展及接收面上相位的起伏,造成图像模糊和抖动,甚至扭曲变形。
Hufnagel and Stanley 根据大气湍流的物理特性提出一种退化模型:
H ( u , v ) = e − k ( u 2 + v 2 ) 5 / 6 H(u,v) = e^{-k (u^2+v^2)^{5/6}} H(u,v)=e−k(u2+v2)5/6
k 是湍流常数,反映湍流的强烈程度。
# 9.19: 湍流模糊退化模型 (turbulence blur degradation model)
def getDegradedImg(image, Huv): # 根据退化模型生成退化图像
rows, cols = image.shape[:2] # 图片的高度和宽度
# (1) 中心化, centralized 2d array f(x,y) * (-1)^(x+y)
mask = np.ones((rows, cols))
mask[1::2, ::2] = -1
mask[::2, 1::2] = -1
imageCen = image * mask
# (2) 快速傅里叶变换
dftImage = np.zeros((rows, cols, 2), np.float32)
dftImage[:, :, 0] = imageCen
cv2.dft(dftImage, dftImage, cv2.DFT_COMPLEX_OUTPUT) # 快速傅里叶变换 (rows, cols, 2)
# (4) 构建 频域滤波器传递函数:
Filter = np.zeros((rows, cols, 2), np.float32) # (rows, cols, 2)
Filter[:, :, 0], Filter[:, :, 1] = Huv, Huv
# (5) 在频率域修改傅里叶变换: 傅里叶变换 点乘 滤波器传递函数
dftFilter = dftImage * Filter
# (6) 对修正傅里叶变换 进行傅里叶逆变换,并只取实部
idft = np.ones((rows, cols), np.float32) # 快速傅里叶变换的尺寸
cv2.dft(dftFilter, idft, cv2.DFT_REAL_OUTPUT + cv2.DFT_INVERSE + cv2.DFT_SCALE) # 只取实部
# (7) 中心化, centralized 2d array g(x,y) * (-1)^(x+y)
mask2 = np.ones(dftImage.shape[:2])
mask2[1::2, ::2] = -1
mask2[::2, 1::2] = -1
idftCen = idft * mask2 # g(x,y) * (-1)^(x+y)
# (8) 截取左上角,大小和输入图像相等
imgDegraded = np.uint8(cv2.normalize(idftCen, None, 0, 255, cv2.NORM_MINMAX)) # 归一化为 [0,255]
# print(image.shape, dftFilter.shape, imgDegraded.shape)
return imgDegraded
def turbulenceBlur(img, k=0.001): # 湍流模糊传递函数
# H(u,v) = exp(-k(u^2+v^2)^5/6)
M, N = img.shape[1], img.shape[0]
u, v = np.meshgrid(np.arange(M), np.arange(N))
radius = (u - M//2)**2 + (v - N//2)**2
kernel = np.exp(-k * np.power(radius, 5/6))
return kernel
# 读取原始图像
img = cv2.imread("../images/Fig0525a.tif", 0) # flags=0 读取为灰度图像
# 生成湍流模糊图像
HBlur1 = turbulenceBlur(img, k=0.001) # 湍流模糊传递函数
imgBlur1 = getDegradedImg(img, HBlur1) # 生成湍流模糊图像
HBlur2 = turbulenceBlur(img, k=0.0025)
imgBlur2 = getDegradedImg(img, HBlur2)
plt.figure(figsize=(9, 6))
plt.subplot(131), plt.title("origin"), plt.axis('off'), plt.imshow(img, 'gray')
plt.subplot(132), plt.title("turbulence blur(k=0.001)"), plt.axis('off'), plt.imshow(imgBlur1, 'gray')
plt.subplot(133), plt.title("turbulence blur(k=0.0025)"), plt.axis('off'), plt.imshow(imgBlur2, 'gray')
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123027287)
Copyright 2022 youcans, XUPT
Crated:2022-2-1
相关文章
- opencv之dft及mat类型转换
- 基于OpenCV中dnn模块部署深度学习模型以及blobFromImages方法的使用说明
- OpenCV每日函数 特征检测和描述模块(6) BRISK类 (提取关键点和计算描述符)
- Opencv学习笔记 - 使用OpenCV,scikit-image和Python检测低对比度图像
- 【OpenCV-Python】教程:7-4 KMeans 应用
- 【OpenCV-Python】教程:6-1 相机标定
- Atitit 图像处理 调用opencv 通过java api attilax总结
- 成功解决sub_div.insert(points)cv2.error: OpenCV(3.4.1) C:projectsopencv-pythonopencvmodulesimgproc
- 成功解决cv2.error: OpenCV(4.1.2) C:projectsopencv-pythonopencvmodulesimgprocsrccolor.cpp:182: err
- 已解决cv2.error: OpenCV(4.2.0) C:projectsopencv-pythonopencvmodulesimgprocsrccolor.cpp:182: erro
- OpenCV使用Sobel和Scharr函数进行梯度计算
- OpenCV使用双边滤波对图片进行美化
- OPENCV API 中文手册
- 使用OpenCV-Python+Flask+json完美实现网页与本地互相协同数据流传输: NLP模型聊天文本request传输+图像算法结果传输的解决方案
- OpenCV 加载 ONNX 模型
- OpenCV面、人眼检测
- 在OpenCV里用kNN实现手写数字识别
- 在OpenCV里实现仿射变换—旋转
- 【OpenCV 例程200篇】93. 噪声模型的直方图
- 【OpenCV 例程200篇】80. 频率域图像滤波详细步骤
- OpenCV这么简单为啥不学——1.3、图像缩放resize函数
- opencv-python(PIL)图像处理之训练模型前的几种图预处理
- 模型实战(8)之Win10下VS2019+opencv+CUDA加速yolov5检测
- Opencv 基本操作六 使用基于dnn模块部署onnx语义分割模型(实现argmax函数)
- C++版本的OpenCV 5.x编译生成opencv-python==5.x(GPU版本)接口并进行调用
- OpenCV 入门