zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

Opencv 模型 模糊 例程 300 105
2023-09-14 09:12:51 时间

专栏地址:『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)=ek(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