专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』

【第 7 章:图像复原与重建】
104. 运动模糊退化模型
105. 湍流模糊退化模型

【youcans 的 OpenCV 例程300 篇】105. 湍流模糊退化模型

5.3 模型法估计退化函数

估计图像复原中所用的退化函数,主要有三种方法:观察法、试验法和数学建模方法。

分析导致退化的原因,根据基本原理提出退化模型,如湍流导致的模糊、匀速运动导致的模糊,可以基于模型更加准确地估计退化函数。

下面以运动模糊和大气湍流模型为例,采用退化模型对图像的退化建模。

例程 9.19:湍流模糊退化模型

湍流是自然界中普遍存在的一种复杂的流动现象。物体通过湍流大气成像时,受到湍流效应的影响,出现光强闪烁、光束方向漂移、光束宽度扩展及接收面上相位的起伏,造成图像模糊和抖动,甚至扭曲变形。

Hufnagel and Stanley 根据大气湍流的物理特性提出一种退化模型:

H(u,v)=e−k(u2+v2)5/6H(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] = -1mask[::2, 1::2] = -1imageCen = image * mask# (2) 快速傅里叶变换dftImage = np.zeros((rows, cols, 2), np.float32)dftImage[:, :, 0] = imageCencv2.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] = -1mask2[::2, 1::2] = -1idftCen = 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 imgDegradeddef 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)**2kernel = 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 例程 300 篇】105. 湍流模糊退化模型相关推荐

  1. 【youcans 的 OpenCV 例程 200 篇】105. 湍流模糊退化模型

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...

  2. 【youcans的OpenCV例程300篇】总目录

    版权声明: 转载本系列作品时必须标注以下版权内容: [youcans@qq.com, youcans的OpenCV 例程300篇, https://blog.csdn.net/youcans/cate ...

  3. 【OpenCV 例程 300 篇】107. 退化图像的维纳滤波

    专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』 [第 7 章:图像复原与重建] 106. 退化图像的逆滤波 107. 退化图像的维纳滤波 108. 约束最小二乘方滤波 10 ...

  4. 【OpenCV 例程 300篇】221.加密马赛克图像处理与解密复原

    『youcans 的 OpenCV 例程200篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]221.加密马赛克图像处理与解密复原 9. 图像的马赛克处理 马赛克效果是广泛使用的 ...

  5. 【OpenCV 例程300篇】40. 图像分段线性灰度变换

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程300篇]40. 图像分段线性灰度变换 分段线性变换函数可以增强图像各部分的反差,增强感兴趣的灰 ...

  6. 【OpenCV 例程 300篇】249. 特征描述之视网膜算法(FREAK)

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]249. 特征检测之视网膜算法(FREAK) 1. FREAK 算法简介 快速视网膜 ...

  7. 【OpenCV 例程 300 篇】112. 滤波反投影重建图像

    专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』 [第 7 章:图像复原与重建] 110. 投影和雷登变换 111. 雷登变换反投影重建图像 112. 滤波反投影重建图像 [ ...

  8. 【OpenCV 例程 300篇】241. 尺度不变特征变换(SIFT)

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]241. 尺度不变特征变换(SIFT) 6.4.1 简介 尺度不变特征转换算法(Sc ...

  9. 【OpenCV 例程300篇】250. 梯度算子的传递函数

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程300篇]250. 梯度算子的传递函数 1. 空间卷积与频域滤波 空间域图像滤波是图像与滤波器核 ...

最新文章

  1. B2c商城图片尺寸设定研究 尺寸应该多大合适
  2. python中count()方法
  3. Mysql:好好的索引,为什么要下推?
  4. android intent 跳转卡顿_Intent七大属性
  5. Intellij IDEA2017 的控制台里不识别maven命令问题处理
  6. Code Runner for VS Code 突破 1000 万下载量!支持运行超过 40 种语言
  7. mysql文档 主从_Mysql主从文档
  8. oracle 9.2 imp 表空间,如何imp到不同于原表空间的表空间?
  9. android之camera2预览
  10. 19.卷1(套接字联网API)---密钥管理套接字
  11. 一套不错的php,一套不错的PHP笔试题-附答案.pdf
  12. 纵观中日韩市场 PC视频会议高清时代来临
  13. linux终端怎么设置monaco,Ubuntu中使用Monaco字体美化
  14. Termux字体大小调整
  15. 太阳高度角计算题_【难点突破】太阳高度角与正午太阳高度角区别(附例题解析)...
  16. fu7推挽胆机音质_fu7电子管功放电路图大全(6N8P\6P3P\胆机功放电路\耦合电容器)...
  17. kali扫描内网ip_kali 局域网嗅探
  18. Linux mmc驱动框架(4)——卡检测及初始化
  19. sprintf左右对齐
  20. 如何利用净推荐值(NPS)测量用户忠诚度?

热门文章

  1. 视频千倍压缩背后的技术原理之环路滤波
  2. 电容笔买什么牌子好?2022电容笔品牌排行榜
  3. ROOK-01 集群简单搭建和卸载
  4. 判断三个数是否能构成三角形_七年级 初一下册数学三角形专题复习提纲及经典例题...
  5. 产品设计体会(4014)记一次产品整合预研
  6. springboot引入国际化
  7. 鲁山县蜂蜜峰农李延卿“老骥伏枥,师德为人”---陈帅良
  8. linux查看GPU使用情况 linux如何查看GPU使用情况
  9. Carrying Conundrum CodeForces - 1567C
  10. PageRank 笔记