【OpenCV 例程 300 篇】105. 湍流模糊退化模型
生活随笔
收集整理的這篇文章主要介紹了
【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(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. 湍流模糊退化模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程实践总结(个人)
- 下一篇: #185. [NOIP2016 提高组]