【机器视觉】一文掌握常见图像增强算法。

图像增强算法

  • 1、引言
  • 2、图像增强概述
    • [2.1 定义](#2.1 定义)
    • [2.2 分类体系](#2.2 分类体系)
  • 3、常见图像增强算法
    • [3.1 直方图均衡化](#3.1 直方图均衡化)
      • [3.1.1 定义](#3.1.1 定义)
      • [3.1.2 算法原理](#3.1.2 算法原理)
      • [3.1.3 代码示例](#3.1.3 代码示例)
    • [3.2 伽马校正](#3.2 伽马校正)
      • [3.2.1 定义](#3.2.1 定义)
      • [3.2.2 算法原理](#3.2.2 算法原理)
      • [3.2.3 代码示例](#3.2.3 代码示例)
    • [3.3 高斯滤波](#3.3 高斯滤波)
      • [3.3.1 定义](#3.3.1 定义)
      • [3.3.2 算法原理](#3.3.2 算法原理)
      • [3.3.3 代码示例](#3.3.3 代码示例)
    • [3.4 同态滤波](#3.4 同态滤波)
      • [3.4.1 定义](#3.4.1 定义)
      • [3.4.2 算法原理](#3.4.2 算法原理)
      • [3.4.3 代码示例](#3.4.3 代码示例)
    • [3.5 中值滤波](#3.5 中值滤波)
      • [3.5.1 定义](#3.5.1 定义)
      • [3.5.2 算法原理](#3.5.2 算法原理)
      • [3.5.3 代码示例](#3.5.3 代码示例)
    • [3.6 拉普拉斯锐化](#3.6 拉普拉斯锐化)
      • [3.6.1 定义](#3.6.1 定义)
      • [3.6.2 算法原理](#3.6.2 算法原理)
      • [3.6.3 代码示例](#3.6.3 代码示例)
  • 4、算法性能比较
  • 5、总结

1、引言

小屌丝 :鱼哥,你可算是回来了
小鱼 :时间如梭啊~
小屌丝 :听你这意思,是不想回来?
小鱼 :那倒没有,哪里都不如自己的国家啊。
小屌丝 :这话说得带劲
小鱼 :这也是我们国家给我们的自豪感。
小屌丝 :你说的是这个么?

小鱼 :看来,你也是关注咱的军事动态啊。
小屌丝 :那我的夸夸你啊, 在国外,也关注国家的军事动态
小鱼 :这得夸"咱妈"啊: 福建舰入列,H2O也快入列...
小屌丝 :呱唧呱唧
小鱼 :你看天也冷了,咱边泡澡,边聊?
小屌丝 :不急,我有一个问题。
小鱼 :打住,你是不是想问 图像算法的是?
小屌丝 :呦呵~ 鱼哥,你这又神啊,咋知道的?
小鱼 :边泡澡边聊
小屌丝:行啊~

2、图像增强概述

2.1 定义

图像增强是指通过一系列技术手段改善图像视觉效果或将图像转换成更适合人或机器分析处理的形式的技术过程。其主要目标包括:

  • 改善图像的主观视觉质量
  • 突出图像中的特定信息
  • 抑制不希望的噪声或失真
  • 增强图像中的某些特征以供后续处理

2.2 分类体系

根据处理域的不同,图像增强算法可分为以下几大类:

text 复制代码
图像增强算法
├── 空间域增强
│   ├── 点运算
│   │   ├── 灰度变换
│   │   ├── 直方图处理
│   │   └── 对比度增强
│   └── 邻域运算
│       ├── 平滑滤波
│       └── 锐化滤波
├── 频率域增强
│   ├── 低通滤波
│   ├── 高通滤波
│   └── 同态滤波
└── 彩色图像增强
    ├── 伪彩色增强
    └── 真彩色增强

3、常见图像增强算法

3.1 直方图均衡化

3.1.1 定义

直方图均衡化是一种通过重新分布图像像素强度值来增强图像对比度的技术。

它将输入图像的直方图变换为在整个强度范围内均匀分布的直方图。

3.1.2 算法原理

对于离散图像,直方图均衡化的变换函数为:

s k = T ( r k ) = ∑ j = 0 k n j n s_k = T(r_k) = \sum_{j=0}^{k} \frac{n_j}{n} sk=T(rk)=j=0∑knnj

其中 r k r_k rk 是输入强度级, s k s_k sk 是输出强度级, n j n_j nj 是强度级 r j r_j rj 的像素数, n n n 是总像素数。

3.1.3 代码示例

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

def histogram_equalization_demo():
    # 读取图像
    img = cv2.imread('input.jpg', 0)  # 以灰度模式读取
    
    # 直方图均衡化
    equ = cv2.equalizeHist(img)
    
    # 显示原图和结果
    plt.figure(figsize=(12, 6))
    
    plt.subplot(2, 2, 1)
    plt.imshow(img, cmap='gray')
    plt.title('Original Image')
    plt.axis('off')
    
    plt.subplot(2, 2, 2)
    plt.imshow(equ, cmap='gray')
    plt.title('Equalized Image')
    plt.axis('off')
    
    plt.subplot(2, 2, 3)
    plt.hist(img.flatten(), 256, [0, 256], color='r')
    plt.title('Original Histogram')
    plt.xlim([0, 256])
    
    plt.subplot(2, 2, 4)
    plt.hist(equ.flatten(), 256, [0, 256], color='b')
    plt.title('Equalized Histogram')
    plt.xlim([0, 256])
    
    plt.tight_layout()
    plt.show()

# 执行示例
histogram_equalization_demo()

3.2 伽马校正

3.2.1 定义

伽马校正是一种非线性操作,用于校正图像的亮度响应。

它通过幂律变换调整图像的像素强度

3.2.2 算法原理

V o u t = A ⋅ V i n γ V_{out} = A \cdot V_{in}^{\gamma} Vout=A⋅Vinγ

其中 V i n V_{in} Vin 是输入像素值, V o u t V_{out} Vout 是输出像素值, A A A 是常数(通常为1), γ \gamma γ 是伽马值。

3.2.3 代码示例

python 复制代码
def gamma_correction_demo():
    # 读取图像
    img = cv2.imread('input.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # 定义伽马值
    gamma_values = [0.5, 1.0, 1.5, 2.0]
    
    plt.figure(figsize=(15, 10))
    
    for i, gamma in enumerate(gamma_values):
        # 应用伽马校正
        inv_gamma = 1.0 / gamma
        table = np.array([((j / 255.0) ** inv_gamma) * 255 
                         for j in np.arange(0, 256)]).astype("uint8")
        corrected = cv2.LUT(img, table)
        
        plt.subplot(2, 2, i+1)
        plt.imshow(corrected)
        plt.title(f'Gamma Correction (γ={gamma})')
        plt.axis('off')
    
    plt.tight_layout()
    plt.show()

# 执行示例
gamma_correction_demo()

3.3 高斯滤波

3.3.1 定义

高斯滤波是一种线性平滑滤波器,使用高斯函数作为卷积核,能有效去除高斯噪声并保留图像边缘信息。

3.3.2 算法原理

G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} G(x,y)=2πσ21e−2σ2x2+y2

其中 σ \sigma σ 是标准差,控制平滑程度

3.3.3 代码示例

python 复制代码
def gaussian_filter_demo():
    # 读取图像并添加高斯噪声
    img = cv2.imread('input.jpg', 0)
    
    # 添加高斯噪声
    noise = np.random.normal(0, 25, img.shape).astype(np.uint8)
    noisy_img = cv2.add(img, noise)
    
    # 应用不同大小的高斯滤波器
    kernel_sizes = [3, 5, 7, 9]
    
    plt.figure(figsize=(15, 10))
    
    plt.subplot(2, 3, 1)
    plt.imshow(img, cmap='gray')
    plt.title('Original Image')
    plt.axis('off')
    
    plt.subplot(2, 3, 2)
    plt.imshow(noisy_img, cmap='gray')
    plt.title('Noisy Image')
    plt.axis('off')
    
    for i, ksize in enumerate(kernel_sizes):
        # 应用高斯滤波
        blurred = cv2.GaussianBlur(noisy_img, (ksize, ksize), 0)
        
        plt.subplot(2, 3, i+3)
        plt.imshow(blurred, cmap='gray')
        plt.title(f'Gaussian Filter (size={ksize})')
        plt.axis('off')
    
    plt.tight_layout()
    plt.show()

# 执行示例
gaussian_filter_demo()

3.4 同态滤波

3.4.1 定义

同态滤波是一种在频率域中同时压缩亮度范围和增强对比度的方法,特别适用于处理光照不均匀的图像。

3.4.2 算法原理

同态滤波基于图像的照射-反射模型:
f ( x , y ) = i ( x , y ) ⋅ r ( x , y ) f ( x , y ) = i ( x , y ) ⋅ r ( x , y ) f(x,y) = i(x,y) \cdot r(x,y)f(x,y)=i(x,y)⋅r(x,y) f(x,y)=i(x,y)⋅r(x,y)f(x,y)=i(x,y)⋅r(x,y)

通过对数变换将乘法关系转换为加法关系,在频率域进行滤波,最后通过指数变换恢复图像。

3.4.3 代码示例

python 复制代码
def homomorphic_filter_demo():
    # 读取图像
    img = cv2.imread('input.jpg', 0)
    img = np.float32(img) / 255.0
    
    # 同态滤波参数
    gamma_l = 0.5  # 低频增益
    gamma_h = 2.0  # 高频增益
    c = 1.0        # 锐化常数
    d0 = 10        # 截止频率
    
    # 获取图像尺寸
    rows, cols = img.shape
    crow, ccol = rows // 2, cols // 2
    
    # 创建同态滤波器
    u, v = np.meshgrid(np.arange(cols) - ccol, np.arange(rows) - crow)
    d = np.sqrt(u**2 + v**2)
    h = (gamma_h - gamma_l) * (1 - np.exp(-c * (d**2 / d0**2))) + gamma_l
    
    # 应用同态滤波
    img_log = np.log(img + 1e-6)  # 避免log(0)
    img_fft = np.fft.fft2(img_log)
    img_fft_shift = np.fft.fftshift(img_fft)
    
    # 频域滤波
    filtered_fft = img_fft_shift * h
    
    # 逆变换
    filtered_fft_ishift = np.fft.ifftshift(filtered_fft)
    filtered_img = np.fft.ifft2(filtered_fft_ishift)
    filtered_img = np.real(filtered_img)
    
    # 指数变换
    result = np.exp(filtered_img)
    result = np.uint8(np.clip(result * 255, 0, 255))
    
    plt.figure(figsize=(12, 6))
    
    plt.subplot(1, 2, 1)
    plt.imshow(np.uint8(img * 255), cmap='gray')
    plt.title('Original Image')
    plt.axis('off')
    
    plt.subplot(1, 2, 2)
    plt.imshow(result, cmap='gray')
    plt.title('Homomorphic Filtered Image')
    plt.axis('off')
    
    plt.tight_layout()
    plt.show()

# 执行示例
homomorphic_filter_demo()

3.5 中值滤波

3.5.1 定义

中值滤波是一种非线性滤波技术,用像素邻域的中值代替该像素值,能有效去除椒盐噪声同时保护图像边缘。

3.5.2 算法原理

3.5.3 代码示例

python 复制代码
def median_filter_demo():
    # 读取图像并添加椒盐噪声
    img = cv2.imread('input.jpg', 0)
    
    # 添加椒盐噪声
    noisy_img = img.copy()
    salt_pepper_prob = 0.05
    # 添加盐噪声
    salt_mask = np.random.random(img.shape) < salt_pepper_prob/2
    noisy_img[salt_mask] = 255
    # 添加椒噪声
    pepper_mask = np.random.random(img.shape) < salt_pepper_prob/2
    noisy_img[pepper_mask] = 0
    
    # 应用中值滤波
    kernel_sizes = [3, 5, 7]
    
    plt.figure(figsize=(12, 8))
    
    plt.subplot(2, 2, 1)
    plt.imshow(img, cmap='gray')
    plt.title('Original Image')
    plt.axis('off')
    
    plt.subplot(2, 2, 2)
    plt.imshow(noisy_img, cmap='gray')
    plt.title('Noisy Image (Salt & Pepper)')
    plt.axis('off')
    
    for i, ksize in enumerate(kernel_sizes):
        # 应用中值滤波
        filtered = cv2.medianBlur(noisy_img, ksize)
        
        plt.subplot(2, 2, i+3)
        plt.imshow(filtered, cmap='gray')
        plt.title(f'Median Filter (size={ksize})')
        plt.axis('off')
    
    plt.tight_layout()
    plt.show()

# 执行示例
median_filter_demo()

3.6 拉普拉斯锐化

3.6.1 定义

拉普拉斯锐化是一种基于二阶导数的图像增强技术,通过增强图像中的灰度突变来突出边缘和细节。

3.6.2 算法原理

∇ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \nabla^2 f = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} ∇2f=∂x2∂2f+∂y2∂2f

离散形式的拉普拉斯算子常用卷积核表示,如:

0 − 1 0 − 1 4 − 1 0 − 1 0 \] \\begin{bmatrix} 0 \& -1 \& 0 \\\\ -1 \& 4 \& -1 \\\\ 0 \& -1 \& 0 \\end{bmatrix} 0−10−14−10−10 #### 3.6.3 代码示例 ```python def laplacian_sharpening_demo(): # 读取图像 img = cv2.imread('input.jpg', 0) # 应用高斯模糊模拟平滑图像 blurred = cv2.GaussianBlur(img, (5, 5), 0) # 拉普拉斯锐化 laplacian = cv2.Laplacian(blurred, cv2.CV_64F) # 将拉普拉斯结果转换为8位图像 laplacian_abs = cv2.convertScaleAbs(laplacian) # 将原图与拉普拉斯结果相加实现锐化 sharpened = cv2.addWeighted(img, 1.5, laplacian_abs, -0.5, 0) plt.figure(figsize=(15, 5)) plt.subplot(1, 3, 1) plt.imshow(img, cmap='gray') plt.title('Original Image') plt.axis('off') plt.subplot(1, 3, 2) plt.imshow(laplacian_abs, cmap='gray') plt.title('Laplacian Filter Result') plt.axis('off') plt.subplot(1, 3, 3) plt.imshow(sharpened, cmap='gray') plt.title('Sharpened Image') plt.axis('off') plt.tight_layout() plt.show() # 执行示例 laplacian_sharpening_demo() ``` ## 4、算法性能比较 | 算法 | 优点 | 缺点 | 适用场景 | |--------|---------------|--------------|----------| | 直方图均衡化 | | 简单有效,显著增强对比度 | 可能过度增强噪声 | | 伽马校正 | 灵活调整亮度,计算简单 | 需要手动调整参数 | 光照校正 | | 高斯滤波 | 有效去除高斯噪声,保持边缘 | 可能模糊细节 | 一般性去噪 | | 中值滤波 | 有效去除椒盐噪声,保护边缘 | 对高斯噪声效果一般 | 脉冲噪声去除 | | 拉普拉斯锐化 | 突出边缘和细节 | 增强噪声 | 边缘增强 | | 同态滤波 | 同时处理亮度和对比度 | 计算复杂 | 非均匀光照 | ## 5、总结 看到这里,常见图像增强算法就差不多聊完了。 最后再唠叨一句:在实际项目中,建议根据具体需求、资源约束和性能要求,在传统方法和深度学习方法之间做出合适的选择。 我是[**小鱼**](https://blog.csdn.net/wuyoudeyuer?type=blog): * **CSDN 博客专家**; * **AIGC 技术MVP专家**; * **阿里云 专家博主**; * **51CTO博客专家**; * **企业认证金牌面试官**; * **多个名企认证\&特邀讲师等**; * **名企签约职场面试培训、职场规划师**; * **多个国内主流技术社区的认证专家博主**; * **多款主流产品(阿里云等)评测一等奖获得者**; 关注**小鱼**,学习[**【机器视觉与目标检测】**](https://blog.csdn.net/wuyoudeyuer/category_12756072.html?spm=1001.2014.3001.5482)最新最全的领域知识。

相关推荐
放羊郎2 小时前
人工智能算法优化YOLO的目标检测能力
人工智能·算法·yolo·视觉slam·建图
xuehaikj2 小时前
基于YOLOv5-AUX的棕熊目标检测与识别系统实现
人工智能·yolo·目标检测
无敌最俊朗@3 小时前
友元的作用与边界
算法
Miraitowa_cheems3 小时前
LeetCode算法日记 - Day 104: 通配符匹配
linux·数据结构·算法·leetcode·深度优先·动态规划
xier_ran3 小时前
深度学习:从零开始手搓一个深层神经网络
人工智能·深度学习·神经网络
却道天凉_好个秋3 小时前
OpenCV(二十六):高斯滤波
人工智能·opencv·计算机视觉
汗流浃背了吧,老弟!3 小时前
语言模型(Language Model)介绍
人工智能·语言模型·自然语言处理
沫儿笙3 小时前
IGM焊接机器人节气设备
人工智能·机器人
程序员东岸3 小时前
从零开始学二叉树(上):树的初识 —— 从文件系统到树的基本概念
数据结构·经验分享·笔记·学习·算法