3.5 Python图像的频域图像增强-同态滤波器

3.5 Python图像的频域图像增强-同态滤波器

1 算法原理

同态滤波是一种在频域中同时能够压缩图像的亮度范围和增强图像对比度的方法。下面推导同态滤波的流程:

基于图像成像模型:一幅图像f(x, y)可以表示成它的照度分量i(x, y)与反射分量r(x, y)的乘积。

成像模型(照度和反射) :

f(x,y)=i(x,y)r(x,y)

(1)两边取对数:

lnf(x,y)= lni(x, y) +Inr(x,y)

(2)两边取傅立叶变换:

F(u,v)= I(u,v) + R(u,v)

(3)用一频域函数H(u, v)处理F(u, v): .

H(u,v)F(u,v)= H(u,v)I(u,v)+ H(u,v)R(u,v)

(4)反变换到空域:

image-20210713094835084

(5)两边取指数:

image-20210713094848143

同态滤波器处理流程如下:

image-20210713094932003

H(u, v):同态(homomorphic)滤波器,分别作用于照度分量和反射分量

(1)图像照射分量变化缓慢;反射分量在边缘处变化剧烈

(2)图像对数的傅立叶变换后的低频部分对应照度分量,高频部分对应反射分量

同态滤波器的特点:对高频和低频成分有不同的影响。

2 代码

运行代码说明

1.要改变代码中的图片地址(地址不能有中文)

更改put(path)函数中的路径put(r'../image/image1.jpg')

2.注意最后的plt.savefig('1.new.jpg')是保存plt图像,如果不使用可以注释掉

import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 同态滤波器
def homomorphic_filter(src, d0=10, r1=0.5, rh=2, c=4, h=2.0, l=0.5):
    gray = src.copy()
    if len(src.shape) > 2:
        gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    gray = np.float64(gray)
    rows, cols = gray.shape

    gray_fft = np.fft.fft2(gray)
    gray_fftshift = np.fft.fftshift(gray_fft)
    dst_fftshift = np.zeros_like(gray_fftshift)
    M, N = np.meshgrid(np.arange(-cols // 2, cols // 2), np.arange(-rows // 2, rows // 2))
    D = np.sqrt(M ** 2 + N ** 2)
    Z = (rh - r1) * (1 - np.exp(-c * (D ** 2 / d0 ** 2))) + r1
    dst_fftshift = Z * gray_fftshift
    dst_fftshift = (h - l) * dst_fftshift + l
    dst_ifftshift = np.fft.ifftshift(dst_fftshift)
    dst_ifft = np.fft.ifft2(dst_ifftshift)
    dst = np.real(dst_ifft)
    dst = np.uint8(np.clip(dst, 0, 255))
    return dst

def put(path):
    image = cv2.imread(path, 1)
    # image = cv2.imread(os.path.join(base, path), 1)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 同态滤波器
    h_image = homomorphic_filter(image, d0=10, r1=0.5, rh=2, c=4, h=2.0, l=0.5)
    plt.subplot(121)
    plt.axis('off')
    plt.title('原始图像')
    plt.imshow(image, cmap='gray')

    plt.subplot(122)
    plt.axis('off')
    plt.title('同态滤波器图像')
    plt.imshow(h_image, 'gray')

    # plt.savefig('5.new.jpg')
    plt.show()

# 图像处理函数,要传入路径
put(r'../image/image3.jpg')

3 效果

image-20210713095233022

image-20210713095244980

  • 8
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python中可以使用numpy和opencv库进行图像频域滤波。 1.使用numpy库实现图像频域滤波 频域滤波的步骤是: (1)读入图像 (2)将图像转换为灰度图 (3)进行傅里叶变换,得到频域图像 (4)设计滤波 (5)对频域图像进行滤波操作 (6)进行傅里叶逆变换,得到滤波后的图像 代码示例: ```python import cv2 import numpy as np # 读入图像 img = cv2.imread('img.jpg') # 将图像转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 进行傅里叶变换,得到频域图像 f = np.fft.fft2(gray) fshift = np.fft.fftshift(f) # 构建高通滤波 rows, cols = gray.shape crow, ccol = rows // 2, cols // 2 mask = np.ones((rows, cols), np.uint8) mask[crow - 30: crow + 30, ccol - 30: ccol + 30] = 0 # 对频域图像进行滤波操作 fshift = fshift * mask # 进行傅里叶逆变换,得到滤波后的图像 ishift = np.fft.ifftshift(fshift) i = np.fft.ifft2(ishift) result = np.abs(i) # 显示原图和滤波后的图像 cv2.imshow('Original', gray) cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 2.使用opencv库实现图像频域滤波 OpenCV提供了cv2.dft()和cv2.idft()函数,可以方便地实现图像的傅里叶变换和逆变换。与numpy库相比,opencv库的实现更加简单。频域滤波的步骤与上面的步骤相同。 代码示例: ```python import cv2 import numpy as np # 读入图像 img = cv2.imread('img.jpg') # 将图像转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 进行傅里叶变换,得到频域图像 dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) # 构建高通滤波 rows, cols = gray.shape crow, ccol = rows // 2, cols // 2 mask = np.ones((rows, cols, 2), np.uint8) mask[crow - 30: crow + 30, ccol - 30: ccol + 30] = 0 # 对频域图像进行滤波操作 fshift = dft_shift * mask # 进行傅里叶逆变换,得到滤波后的图像 ishift = np.fft.ifftshift(fshift) i = cv2.idft(ishift) result = cv2.magnitude(i[:, :, 0], i[:, :, 1]) # 显示原图和滤波后的图像 cv2.imshow('Original', gray) cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值