python图像处理 ——几种图像增强技术

news/2025/2/14 7:12:39/

图像处理 ——几种图像增强技术

  • 前言
  • 一、几种图像增强技术
    • 1.直方图均衡化
    • 2.直方图适应均衡化
    • 3.灰度变换
    • 4.同态滤波
    • 5.对比拉伸
    • 6.对数变换
    • 7.幂律变换(伽马变换)

前言

图像增强是指通过各种算法和技术,改善或提高数字图像的质量、清晰度、对比度、亮度、颜色等方面的处理过程。它可以通过调整图像的像素值来改善图像的可视化效果,使图像更易于观察和分析。图像增强广泛应用于医学影像诊断、监控、遥感、数字图像处理等领域。常见的图像增强方法包括灰度拉伸、直方图均衡化、滤波、锐化、颜色增强等。

一、几种图像增强技术

1.直方图均衡化

想象一下如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很广泛。所以你应该把它的直方图做一个横向拉伸(如下图),这就是直方图均衡化要做的事情。通常情况下这种操作会改善图像的对比度。

在这里插入图片描述
代码如下

# -*- coding: utf-8 -*-
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('gray.png', 0)
#=============================直方图均衡化==========================
equ = cv2.equalizeHist(img)

2.直方图适应均衡化

直方图适应均衡化(CLAHE)是数字图像处理中用于增强图像对比度的一种技术。它可以将原始图像中局部对比度较低的区域的像素值映射到一个更广的范围内,从而提高图像的整体对比度。

CLAHE算法可以有效地增强图像的对比度,尤其适用于图像中存在大范围灰度变化的情况下。但是,CLAHE算法也存在一些问题,如对于纹理复杂的图像(如自然场景图片)可能会产生可见的块状伪影等。因此在实际应用中还需要结合其他技术进行综合处理。

代码如下

#=============================直方图适应均衡化==========================
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(16,16))
"""
该函数包含以下参数:
clipLimit: 用于控制直方图均衡化的局部对比度,值越高,越容易出现失真和噪声。建议值为2-4,若使用默认值0则表示自动计算。
tileGridSize: 表示每个块的大小,推荐16x16。
tileGridSize.width: 块的宽度。
tileGridSize.height: 块的高度。
函数返回一个CLAHE对象,可以通过该对象调用apply函数来实现直方图均衡化。
"""
cl1 = clahe.apply(img)

3.灰度变换

灰度变换的基本思想是将灰度值在某个范围内的像素值通过某种函数关系映射到另一个范围内的像素值。常见的灰度变换函数有对数变换、幂变换、反转变换等。具体的变换函数的选择取决于实际应用中需要增强的目标属性。
代码如下

#=============================灰度变换==========================
# 通过将像素值映射到新的范围来增强图像的灰度
min_gray = 0  # 新的最小灰度值
max_gray = 255  # 新的最大灰度值
gray_img_enhanced = cv2.convertScaleAbs(img, alpha=(max_gray-min_gray)/255, beta=min_gray)

4.同态滤波

同态滤波是一种常用的图像增强技术,它能够增强图像的低频信息,同时抑制高频信息。同态滤波的本质是利用了信号的对数域与频率域之间的对应关系,将原图像分解成低频与高频两部分,对低频进行增强,对高频进行抑制,然后再将两部分合并起来得到增强后的图像。

同态滤波可以用以下公式表示:

H ( u , v ) = γ H − γ L ( 1 − e − c ( D 2 ( u , v ) D 0 2 ) ) H(u,v) = \gamma_H - \gamma_L(1-e^{-c(\frac{D^2(u,v)}{D_0^2})}) H(u,v)=γHγL(1ec(D02D2(u,v)))

其中, H ( u , v ) H(u,v) H(u,v) 是频域中的同态滤波函数, D ( u , v ) D(u,v) D(u,v) 表示频率域中点 ( u , v ) (u,v) (u,v) 到图像中心的距离, D 0 D_0 D0 是频率域中的截止频率, c c c 是控制增益的参数, γ H \gamma_H γH γ L \gamma_L γL 分别是高频增益和低频衰减系数。

同态滤波的具体步骤如下:

1.将原图像转换到对数域。
2.对转换后的图像进行离散傅里叶变换,得到频率域的图像。
3.根据上述公式计算同态滤波函数 H ( u , v ) H(u,v) H(u,v)
4.将 H ( u , v ) H(u,v) H(u,v) 与频率域的图像相乘,得到增强后的频率域图像。
5.对增强后的频率域图像进行反傅里叶变换,得到增强后的图像。

同态滤波技术主要应用于图像的增强、去噪、颜色校正、图像分割等领域。它可以有效地增强低光度图像、消除背景噪声等问题,并且能够适用于各种类型的图像,具有广泛的应用前景。
代码如下

#=============================同态滤波==========================
gray = cv2.bilateralFilter(img, 15, 75, 75)
# 对数变换和傅里叶变换
H, W = gray.shape
gray_log = np.log(gray+1)
gray_fft = np.fft.fft2(gray_log)
# 设置同态滤波器参数
c, d, gamma_L, gamma_H, gamma_C = 1, 10, 0.2, 2.5, 1
# 构造同态滤波器
u, v = np.meshgrid(range(W), range(H))
Duv = np.sqrt((u-W/2)**2 + (v-H/2)**2)
Huv = (gamma_H - gamma_L) * (1 - np.exp(-c*(Duv**2)/(d**2))) + gamma_L
Huv = Huv * (1 - gamma_C) + gamma_C
# 进行频域滤波
gray_fft_filtered = Huv * gray_fft
gray_filtered = np.fft.ifft2(gray_fft_filtered)
gray_filtered = np.exp(np.real(gray_filtered))-1
# 转为uint8类型
gray_filtered = cv2.normalize(gray_filtered, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)

5.对比拉伸

对比拉伸称为归一化,用于拉伸强度值的范围以提高图像的对比度。Python/OpenCV 可以通过使用 min_max 归一化的 cv2.normalize() 方法进行对比度拉伸。
代码如下

#=============================对比拉伸==========================
norm_img1 = cv2.normalize(img,None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
# scale to uint8
norm_img1 = (255 * norm_img1).astype(np.uint8)

6.对数变换

对数变换用于将图像的每个像素值替换为其对数值,以增强较低强度值的对比度。它有助于缩小较亮的像素值范围并扩大暗像素。当需要减少图像的偏度分布以获得更好的解释时,可以应用此转换。
代买如下

#=============================对数变换==========================
# Apply log transformation method
c = 255 / np.log(1 + np.max(img))
log_image = c * (np.log(img + 1))
# Specify the data type so that
# float value will be converted to int
log_image = np.array(log_image, dtype=np.uint8)

7.幂律变换(伽马变换)

幂律变换用于从较亮图像到较暗图像突出显示对象,可以通过以下表达式使用:s = c × r^ γ ,其中 s 和 r 分别是输出和输入图像的像素值,c 是常数值,γ称为伽马值。为了减少不同强度值的计算机显示器显示问题,在此转换中使用了不同的伽马值
代买如下

#=============================幂律变换(伽马变换)==========================
# Apply Gamma=0.4 on the normalised image and then multiply by scaling constant (For 8 bit, c=255)
gamma_point_eight = np.array(255 * (img / 255) ** 0.8, dtype='uint8')

在这里插入图片描述
希望你喜欢阅读这篇文章,希望它能帮助你了解不同类型的图像增强技术。


http://www.ppmy.cn/news/1196813.html

相关文章

DAY43 完全背包理论基础 + 518.零钱兑换II

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

讲座分享|《追AI的人》——中国科学技术大学张卫明教授分享《人工智能背景下的数字水印》

本篇博客记录 2023年11月1日 《人工智能背景下的数字水印》 讲座笔记。 先来明确一下水印在信息隐藏中的定位,如下图: 目录 概述AI for Watermark图像传统攻击方式(如JPEG压缩)跨媒介攻击方式(屏摄) 文档水…

Jetpack:028-Jetpack中的Card

文章目录 1. 概念介绍2. 使用方法2.1 主要类型2.2 其它类型 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中Switch相关的内容,本章回中 主要介绍Card。闲话休提,让我们一起Talk Android Jetpack吧! 1. 概念介绍 我们在本章回中介…

orangepi zero2 全志H616 SSD1306 OLED屏幕测试程序 (已附源码)

orangepi zero2 H616 SSD1306 OLED屏幕测试程序 orangepi zero2 配置wiringpi 库后,突发奇想构建一个测试oled屏幕的程序,放一个蜗牛每次移动一个像素点,实时显示蜗牛的步数,后面要显示其他内容在此代码上修改即可,如…

Python基础入门例程32-NP32 牛牛的加减器(运算符)

最近的博文: Python基础入门例程31-NP31 团队分组(列表)-CSDN博客 Python基础入门例程30-NP30 用列表实现队列(列表)-CSDN博客 Python基础入门例程29-NP29 用列表实现栈(列表)-CSDN博客 目录…

MyBatis 详解

目录 1.MyBatis 框架的搭建 1.1 创建数据库和表 1.2 添加 MyBatis 依赖 1.3 设置 MyBatis 配置 1.3.1 设置数据库的连接信息 1.3.2 设置 XML 保存路径和命名格式 1.4 根据 MyBatis 写法完成数据库得操作 1.4.1 定义接口 1.4.2 使用 XML 实现接口 2.MyBatis查询操作 …

配置Raspberry自动连接WIFI,在无法查看路由器的校园网情况下使用自己电脑热点

1、开启电脑热点,并共享电脑WLAN2 打开控制面板->网络和Internet->网络连接 选择自己的校园网,我这里是WLAN2,右键属性,如下操作: 如果没有看到 本地连接*10类似的图标 则按如下操作:winx键&#x…

Day13反转链表两两交换链表中的节点删除链表的倒数第N个节点链表相交环形链表II

反转链表 struct ListNode* reverseList(struct ListNode* head){struct ListNode* preNULL;while(head){struct ListNode* temphead->next;head->nextpre;prehead;headtemp;}return pre; }两两交换链表中的节点 struct ListNode* swapPairs(struct ListNode* head){st…