【数字图像处理2.2】同态滤波器 增强图像 Python+Opencv

文章目录

    • 说在前面!!!!!
    • 1、同态滤波简介
    • 2、原理图
    • 3、实现思路和步骤
    • 4、最终效果
    • 5、源代码

说在前面!!!!!

  • 同态滤波器有很多细节需要挖掘,尤其是数学方面。而我目前也只是学习中,会有一些问题和错误,有问题可以评论留言。
  • 另外,频率域中,高通滤波器、低通滤波器的效果见:

https://blog.csdn.net/qq_30154571/article/details/109141855

1、同态滤波简介

  • 同态滤波,作用在频率域中(之前做的练习:直方图啊、平滑滤波器都是作用在空间域\图像域的算法,而这次是频率域)
  • 其作用是对 图像灰度范围 进行调整,通过消除图像上照明不均匀的问题,增强图像的细节,同时不损失亮区的图像细节。
  • 能够压缩图像亮度范围、增强图像对比度。
  • 我们希望对低频能量进行压制,这样就降低了动态范围,而要对高频进行提高,这样就增强了图像的对比度,示意图如下:

2、原理图

【数字图像处理2.2】同态滤波器 增强图像 Python+Opencv_第1张图片

3、实现思路和步骤

这一步参考来自网络:

https://blog.csdn.net/wujuxKkoolerter/article/details/95088851

(课件里内容一样,只不过博客中好截图)

在这里插入图片描述

【数字图像处理2.2】同态滤波器 增强图像 Python+Opencv_第2张图片
注意:

  • 经过测试,貌似【(1) 图像取对数】这一步,忽略掉好像也没什么影响,我在代码中将会忽略取对数这一步骤。
  • 究其原因,可能是由于我在网上找的这个增强函数本身在数学上做到了类似取对数的操作。
  • 详细的思路,我将在代码注释中体现。

4、最终效果


图像瞬间亮堂了很多。

5、源代码

import cv2
import numpy as np

#网上没找到现成的同态滤波器的包,所以自定义实现同态滤波器

#####################################################################
#############        自定义同态滤波器函数      ################r1-亮度
#####################################################################
def homomorphic_filter(src, d0=1, r1=2, rh=2, c=4, h=2.0, l=0.5):

    #图像灰度化处理
    gray = src.copy()
    if len(src.shape) > 2:#维度>2
        gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

    #图像格式处理
    gray = np.float64(gray) 

    #设置数据维度n
    rows, cols = gray.shape

    #傅里叶变换
    gray_fft = np.fft.fft2(gray) 
    
    #将零频点移到频谱的中间,就是中间化处理
    gray_fftshift = np.fft.fftshift(gray_fft)
    
    #生成一个和gray_fftshift一样的全零数据结构
    dst_fftshift = np.zeros_like(gray_fftshift)

    #arange函数用于创建等差数组,分解f(x,y)=i(x,y)r(x,y)
    M, N = np.meshgrid(np.arange(-cols // 2, cols // 2), np.arange(-rows//2, rows//2))#注意,//就是除法

    #使用频率增强函数处理原函数(也就是处理原图像dst_fftshift)
    D = np.sqrt(M ** 2 + N ** 2)#**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中,比0小的都会变成0,比0大的都变成255
    #uint8是专门用于存储各种图像的(包括RGB,灰度图像等),范围是从0–255
    dst = np.uint8(np.clip(dst, 0, 255))
    return dst
#自定义函数完毕

#########################################################
################       主函数开始         ################
#########################################################

img = cv2.imread('pic\\4.jpg',0)
#将图片执行同态滤波器
img_new = homomorphic_filter(img)
#cv2.imwrite("TongTai", img_new)

#输入和输出合并在一起输出
result = np.hstack((img,img_new))
#打印
cv2.imshow('outputPicName',result)

cv2.waitKey()
cv2.destroyAllWindows()



你可能感兴趣的:(数字图像处理,数字图像处理,同态滤波器,同态滤波,1024程序员节)