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

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

  • 前言
  • 一、几种图像增强技术
    • 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')

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/114974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3.22每日一题(二重积分求平面区域面积)

先复习求平面积分的公式 注:面对平面积分直接使用二重积分对1求积分即可;所以只需要背二重积分的两个公式: 1、直角坐标下对1积分 2、极坐标下对1积分 xy-1是等轴双曲线!! 1、先画图定区域 2、选择先对x积分还是先对…

深度学习之基于Yolov5闯红灯及红绿灯检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、闯红灯及红绿灯检测系统![请添加图片描述](https://img-blog.csdnimg.cn/8f260c2ed5ed4d8596e27d38abe42745.jpeg)四. 总结 一项目简介 基于Y…

力扣 upper_bound 和 lower_bound

👨‍🏫 34. 在排序数组中查找元素的第一个和最后一个位置 🌸 AC code 2023版 class Solution {public int[] searchRange(int[] nums, int target) {int[] res { -1, -1 };if(nums.length 0)return res;int l 0;int r nums.length - 1;…

QCC TX 音频输入切换+提示声音

QCC TX 音频输入切换提示声音 QCC蓝牙芯片(QCC3040 QCC3056 等等),AUX、I2S、USB输入 蓝牙音频输入,模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 针对TX切换EQ,调节音量不能出提示声音问题,可以增…

Go 多版本管理

在日常开发工作过程中,很多时候我们都需要在自己的机器上安装多个go版本,像是go1.16引入的embed,go1.18引入了泛型;又或是自己本地使用的是最新版,但公司的项目中使用的go1.14、go1.13甚至是更早的版本。 那么有没有既…

QTreeView 常见节点操作

目录 1、节点遍历 2、设置当前选中项 3、树节点数据绑定 4、树节点自定义样式 5、数据检索 6、获取当前选中项 QTreeView作为项目最经常使用的空间,常用接口和操作必须熟悉熟悉在熟悉!!! 1、节点遍历 void ParamSettingDl…

存储器(详解)

概念 存储器(Memory)是计算机系统中用于存储和检索数据的硬件设备或组件。它在计算机中扮演着重要的角色,允许计算机暂时或永久地存储程序、数据和中间结果。 存储器是许多存储单元的集合,按单元号顺序排列。每个单元由若干二进制…

Flutter屏幕适配

文章目录 一、Flutter单位二、设备信息三、常见适配方案四、flutter_screenutil 一、Flutter单位 Flutter使用的是类似IOS中的点pt(point)。 iPhone6的尺寸是375x667,分辨率为750x1334。 iPhone6的dpr( devicePixelRatio ) 是2.0。 DPR 物…

Dev-C调试的基本方法2-1

在Dev-C中调试程序,首先需要在程序中设置断点,之后以调试的方式运行程序。 1 设置断点 当以调试的方式运行程序时,程序会在断点处停下来。点击要设置断点代码行号左侧部分,此时会有如图1所示的红点和绿色对勾,表示断…

服务号升级订阅号的流程

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务,每月可推送4次,每次最多8篇文章,发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

框架安全-CVE 复现Apache ShiroApache Solr漏洞复现

文章目录 服务攻防-框架安全&CVE 复现&Apache Shiro&Apache Solr漏洞复现中间件列表常见开发框架Apache Shiro-组件框架安全暴露的安全问题漏洞复现Apache Shiro认证绕过漏洞(CVE-2020-1957)CVE-2020-11989验证绕过漏洞CVE_2016_4437 Shiro-…

C++类和对象(七)const成员 及其初始化列表

1.const成员 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。 成员函数定义的原则: 1.能定义成const的成员函数都应该定义…

ElasticSearch集群环境搭建

1、准备三台服务器 这里准备三台服务器如下: IP地址主机名节点名192.168.225.65linux1node-1192.168.225.66linux2node-2192.168.225.67linux3node-3 2、准备elasticsearch安装环境 (1)编辑/etc/hosts(三台服务器都执行) vim /etc/hosts 添加如下内…

NTT DATA利用相干伊辛机模拟基因组组装和疾病治疗的潜力

​(图片来源:网络) 7月20日,日本领先的IT服务提供商和行业咨询公司NTT DATA宣布完成了一个使用量子计算优化基因组组装过程的项目。这是量子计算应用于医疗保健和生命科学行业中的一个里程碑。 本项目通过比较量子和非量子计算方…

时间复杂度为 O(nlogn) 的排序算法

归并排序 归并排序遵循 分治 的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下: 划分:分解待排序的 n 个元素…

口袋参谋:如何玩转手淘“问大家”?这招超好用!

​现在应该不会还有商家不知道,手淘“问大家”分析吧! “问大家”模块对于转化率的影响非常关键,它的影响力不亚于买家秀,以前买家下单前都会去参考买家秀,现在买家更倾向于参考“问大家”然而,真正玩转“问…

PostgreSQL 进阶 - 使用foreign key,使用 subqueries 插入,inner joins,outer joins

1. 使用foreign key 创建 table CREATE TABLE orders( order_id SERIAL PRIMARY KEY, purchase_total NUMERIC, timestamp TIMESTAMPTZ, customer_id INT REFERENCES customers(customer_id) ON DELETE CASCADE);“order_id”:作为主键的自增序列,使用 …

C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)

懒大王感谢大家的关注和三连支持~ 目录 前言 一、UDP编程 UDP特点: UDP框架: UDP函数学习 发送端代码案例如下: 二、多路复用 前提讲述 select poll 三、图解如下 总结 前言 作者简介: 懒大王敲代码,…

一文明白如何使用常用移动端(Android)自动化测试工具 —— Appium

自动化测试 自动化测试大家都有所了解,近十年来,自动化测试这项技能也一直是软件测试从业者想要掌握的一项技能,根据有关调研显示,希望掌握自动化测试技能的人十年来都约占七成 本文会带来自动化测试中的移动端(Andro…

Notepad++下载、使用

下载 https://notepad-plus-plus.org/downloads/ 安装 双击安装 选择安装路径 使用 在文件夹中搜索 文件类型可以根据需要设置 如 *.* 说明是所有文件类型; *.tar 说明是所有文件后缀是是tar的文件‘;