opencv实战项目(三十一):基于同态滤波的图像亮度提升

文章目录


前言

在数字图像处理领域,图像亮度的调整是一项基本且至关重要的技术。它不仅关系到图像的视觉效果,而且在许多实际应用中,如医疗影像分析、卫星遥感监测、视频监控系统等,都扮演着关键角色。同态滤波作为一种经典的图像增强技术,因其独特的优势而在众多亮度提升方法中脱颖而出。

本文旨在探讨基于同态滤波的图像亮度提升技术。同态滤波技术不仅能够有效地改善图像的亮度,还能同时增强图像的对比度,使图像细节更加清晰。通过对同态滤波原理的深入剖析,我们将探讨如何利用这一技术实现图像亮度的优化


一、同态滤波

同态滤波(Homomorphic Filtering)是一种广泛应用于信号和图像处理的技术。它的核心思想是将非线性问题转化为线性问题处理,从而简化复杂运算。这一概念最初在1960年代由麻省理工学院的Thomas Stockham、Alan V. Oppenheim和Ronald W. Schafer提出。

在同态滤波中,原始信号通过非线性映射转换到可以使用线性滤波器的不同域,完成运算后再映射回原始域。这种处理方式保持了信号的相关属性不变,将复杂的非线性运算转化为相对简单的线性运算。

在图像处理中,同态滤波特别有用。它可以改善图像的质量,特别是在处理动态范围大但暗区细节不清的图像时。同态滤波通过将图像的照度分量(illumination)和反射分量(reflectance)分离,使用线性滤波方法来提升图像的对比度和亮度。

具体步骤包括:

  1. 读取图像:获取需要处理的图像数据。
  2. 取对数:对图像的每个像素值取对数,将乘性噪声转换为加性噪声。
  3. 傅里叶变换:对对数变换后的图像进行傅里叶变换,将其转换到频域。
  4. 设计滤波器:根据需求设计一个合适的频域滤波器,通常是高通滤波器,以增强图像的细节。
  5. 应用滤波器:在频域中,将设计的滤波器与图像的傅里叶变换结果相乘。
  6. 逆傅里叶变换:对滤波后的频域图像进行逆傅里叶变换,得到空间域中的滤波结果。
  7. 取指数:对逆傅里叶变换的结果进行指数运算,以恢复图像的原始亮度范围。
  8. 调整图像:根据需要对滤波后的图像进行对比度、亮度等调整,以优化视觉效果。

二、算法实现

可以通过修改rh,和rl的数值选择是提亮图片的亮度。

代码如下(示例):

python 复制代码
import cv2
import numpy as np


def homomorphic_filtering_channel(channel, d0=10, rh=2, rl=0.5, c=1):
    # 将图像通道转换为浮点类型并归一化到[0, 1]
    img_float32 = np.float32(channel) / 255.0

    # 对图像取对数
    log_img = np.log1p(img_float32)

    # 傅里叶变换
    fft_img = np.fft.fft2(log_img)

    # 中心化傅里叶变换
    fft_shift = np.fft.fftshift(fft_img)

    # 构建滤波器
    M, N = channel.shape
    u, v = np.meshgrid(np.arange(N), np.arange(M))
    D = np.sqrt((u - N / 2) ** 2 + (v - M / 2) ** 2)
    H = (rh - rl) * (1 - np.exp(-c * (D ** 2 / d0 ** 2))) + rl

    # 应用滤波器
    filtered_fft = H * fft_shift

    # 逆傅里叶变换
    ifft_shift = np.fft.ifftshift(filtered_fft)
    ifft_img = np.fft.ifft2(ifft_shift)

    # 取指数
    exp_img = np.expm1(ifft_img)

    # 归一化到[0, 255]并转换为uint8
    final_img = np.uint8(np.clip(exp_img * 255, 0, 255))

    return final_img


def homomorphic_filtering(image, d0=10, rh=3, rl=3, c=1, gamma=0.5):
    # 分离颜色通道
    channels = cv2.split(image)

    # 对每个颜色通道应用同态滤波
    filtered_channels = [homomorphic_filtering_channel(ch, d0, rh, rl, c, gamma) for ch in channels]

    # 合并颜色通道
    filtered_image = cv2.merge(filtered_channels)

    return filtered_image


# 读取彩色图像
image = cv2.imread(r'C:\Users\zhw\Downloads\mmagic-main\1724658439609.png')

# 应用同态滤波
filtered_image = homomorphic_filtering(image)

# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Homomorphic Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果:

相关推荐
老艾的AI世界3 小时前
新一代AI换脸更自然,DeepLiveCam下载介绍(可直播)
图像处理·人工智能·深度学习·神经网络·目标检测·机器学习·ai换脸·视频换脸·直播换脸·图片换脸
喵~来学编程啦5 小时前
【论文精读】LPT: Long-tailed prompt tuning for image classification
人工智能·深度学习·机器学习·计算机视觉·论文笔记
凤枭香8 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ctrey_9 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
可均可可10 小时前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite
蒙娜丽宁10 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
好喜欢吃红柚子11 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
plmm烟酒僧11 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
AI小杨11 小时前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测
冷凝女子12 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康