OpenCV||超详细的灰度变换和直方图修正

一、点运算

概念:点运算(也称为像素级运算或单像素操作)是指对图像中每一个像素点进行独立、相同的操作,而这些操作不会考虑像素点之间的空间关系。点处理优势也称对比度拉伸、对比度增强或灰度变换等。

目的:点运算在图像处理中广泛应用于对比度增强、亮度调整、直方图均衡化、图像阈值化等方面。通过点运算,可以改善图像的视觉效果,使其更适合于后续的处理和分析。

分类:点运算可分为灰度变换和直方图修正两大方法,其中直方图修正包括直方图均衡化和直方图规范化。

特点:可逆、无法增强图像细节

应用:光度学标定、对比度增强(对比度扩展)、显示标定、轮廓线(例如用点处理进行图像阈值化处理,根据图像的灰度等级把一幅图像划分成一些不连接的区域,这有助于确定图像中对象的边界或定义蒙版)、裁剪(对于8位的灰度图像,在存储每一像素前输出图像的灰度级一定要被裁剪到0~255的范围内)

二、灰度化

概念:灰度化是图像处理中的一个基本步骤,其目的是将彩色图像转换为灰度图像。灰度图像是一种仅包含亮度信息而不包含颜色信息的图像,其像素值通常用一个字节(即0-255的范围)来表示,这个值代表了该像素的灰度等级,也就是亮度。灰度化是许多图像处理任务的第一步,如边缘检测、图像分割、特征提取等,因为灰度图像相对于彩色图像来说,计算量更小,处理速度更快,同时保留了图像的大部分重要信息。

方法:加权平均值法、取最大值法、平均值法等,加权平均值法最为常用

  • D=0.299R+0.587G+0.114B
  • D=max(R,G,B)
  • D=(R+G+B)/3

示例

import cv2
import numpy as np# 绘图展示
def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()image = cv2.imread('img\\1.png')
image_cut = image[0:500, 0:500]
cv_show("image_cut", image_cut)
image_cut[:, :, 0] = image_cut[:, :, 0] * 0.114
image_cut[:, :, 1] = image_cut[:, :, 1] * 0.587
image_cut[:, :, 2] = image_cut[:, :, 2] * 0.299
image_cut_gray = np.sum(image_cut, axis=2, dtype=np.uint8)
cv_show('image_copy_cut', image_cut_gray)

结果展示:

优化转化速度:从次到优

Gray=(2989R+5870G+1140B)/10000

Gray=(4898R+9618G+1868B)>>14

Gray=(76R+150G+30B)>>8

三、对比度

概念:画面明亮部分与阴暗部分的灰度比值。对比度越高,图像中物体轮廓越分明可见,越清晰;相反,图像轮廓模糊,图像不太清晰。

四、灰度变换

灰度变换函数:s=T(r)

作用

  • 对比度拉伸:灰度变换可以扩展图像的对比度,使图像在视觉上更加清晰。当图像的灰度值集中在较窄的范围内时,通过灰度变换可以将其扩展到更宽的灰度区间,从而增强图像的细节表现力。
  • 细节显示:灰度变换能够突出图像中的细节信息,使原本难以分辨的细节变得清晰可见。这对于医学图像处理、遥感图像处理等领域尤为重要。
  • 特征突出:灰度变换可以有选择地突出图像中感兴趣的特征,同时抑制不需要的特征。这对于图像分析、目标检测和识别等任务非常有帮助。
  • 直方图均衡化:灰度变换可以有效地改变图像的直方图分布,使像素的分布更为均匀。这有助于改善图像的视觉效果,并提高后续图像处理的效率。

方法:线性灰度变换、分段线性灰度变换、非线性灰度变化(包括对数函数变换和伽马变换)

  • 对数变换扩展图像中低灰度区域、压缩图像中高灰度区域,增强图像中暗色区域细节;反对数变换与此相反。同时,还能压缩图像灰度值的动态范围,在傅里叶变换中显示更多变换后的频谱细节。
  • 伽马变换用于图像校正,根据参数γ来修正图像中灰度过高(γ>1)或灰度过低(γ<1)的内容。

线性灰度变换

公式:g=kf+b,其中k为斜率,b为为截距(k表示图像对比度变化,b表示图像亮度变化)。

参数

  • 当k>1,输出图像对比度增大;
  • 当k<1,输出图像对比度减小;
  • 当k=1且b≠0,所有图像灰度值上移或下移,整个图像更暗或更亮;
  • 当k=1、b=0,图像无变化;
  • 当k=-1,b=255,输出图像灰度反转;
  • 当k<0且b>0,暗区域变亮,亮区域变暗,点运算完成了图像求补运算。

分段线性灰度变换

将原图像灰度区间划分为多个,对每一个区间使用不同k和b值的线性灰度变换。

对数变换和反对数变换

公式:s=c*log(1+r),其中,c为常数,r≥0。

伽马变换

公式:s=crγ,其中c和γ为正常数。

五、直方图修正

直方图:灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。它是灰度级的函数,表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用probability density function (PDF)来刻画和描述,表现为灰度直方图。

API

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
  • images:源图像,应该放在方括号中,如[img]
  • channels:要计算其直方图的通道索引。对于灰度图像,它总是[0]
  • mask:图像掩模。如果为None,则计算整个图像的直方图。
  • histSize:直方图的大小,放在方括号中,如[256]
  • ranges:像素值范围,通常为[0, 256]

示例

import cv2
import numpy as np
import matplotlib.pyplot as plt# 绘图展示
def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()image = cv2.imread('img\\1.png', 0)
cv_show("image_cut", image)
hist = cv2.calcHist(image, [0], None, [256], [0, 255])
# 使用matplotlib绘制直方图
plt.figure(figsize=(10, 6))
plt.plot(hist)
plt.title("Grayscale Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.grid(True)
plt.show()

直方图均衡化:采用的是累计分布函数,具体不做讲解。

API

cv2.equalizeHist(src[, dst])
  • src:输入图像,必须是8位单通道图像(即灰度图)。
  • dst(可选):输出图像,与输入图像具有相同的尺寸和类型。

示例

import cv2
import numpy as np
import matplotlib.pyplot as plt# 绘图展示
def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()image = cv2.imread('img\\1.png', 0)
image_cut = image[0:500, 0:500]
cv_show("image_cut", image_cut)
image_eq = cv2.equalizeHist(image_cut)
image_hstack = np.hstack((image_cut, image_eq))
cv_show('img', image_hstack)

结果展示

局部自适应直方图均衡化(CLAHE):全局直方图均衡化可能会导致图像的某些区域过亮或过暗,失去细节。为了解决这个问题,可以使用局部自适应直方图均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)。在OpenCV中,可以通过cv2.createCLAHE()函数创建一个CLAHE对象,然后使用其apply()方法对图像进行均衡化。

API

cv2.createCLAHE([, clipLimit[, tileGridSize[, clipNoise]]])
  • clipLimit(可选):颜色对比度的阈值,默认为40。用于限制对比度的放大程度,以避免过度放大噪声。
  • tileGridSize(可选):均衡化时使用的网格大小,默认为(8, 8)。较大的网格可以减少噪声的放大,但可能会降低对比度增强的效果。
  • clipNoise(可选):是否裁剪噪声,对于噪声图像很有用。

示例

import cv2
import numpy as np
import matplotlib.pyplot as plt# 绘图展示
def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()image = cv2.imread('img\\1.png', 0)
image_cut = image[0:500, 0:500]
cv_show("image_cut", image_cut)
"""全局"""
image_eq = cv2.equalizeHist(image_cut)
"""自适应"""
# 创建CLAHE对象
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# 应用CLAHE
image_clahe = clahe.apply(image_cut)
"""图像合并展示"""
image_hstack = np.hstack((image_cut, image_eq, image_clahe))
cv_show('img', image_hstack)

结果展示

最右为局部自适应直方图均衡化效果。

实验原图

链接跳转:

章节一、OpenCV||超细节的基本操作

章节二、OpenCV||超简略的Numpy小tip

章节三、OpenCV||超详细的图像处理模块

章节五、OpenCV||超详细的图像平滑

章节六、OpenCV||超详细的几何变换

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EtherCAT】Windows+Visual Studio配置SOEM主站——静态库配置+部署

目录 一、准备工作 1. Visual Studio 2022 2. Npcap 1.79 3. SOEM源码 二、静态库配置 1. 修改SOEM源码配置 2. 编译SOEM源码 3. 测试 三、静态库部署 1. 新建Visual Studio工程 2. 创建文件夹 3. 创建主函数 4. 复制静态库 5. 复制头文件 6. 配置头文件…

链接、装载和库——1 简介

前言 关于个人的读书笔记 第一章 温故而知新 1.1 从hello,world说起 ​计算机在执行hello,world的时候发生了什么? 1.2 万变不离其宗 ​在计算机多如牛毛的硬件设备中。有三个部件最为关键,它们分别是 CPU、内存和 I/O 控制芯…

一次多波束和浅地层处理的经历—信标机出问题?

最近处理多波束和浅地层时,一个从来没有过的问题出现了。 多波束数据(.pds)是由PDS2000采集的,使用设备型号为T50P。浅地层数据(.raw)是有SESWIN采集的,使用设备型号为SES2000 Standard。 1、多波束处理 多波束数据采用CARIS11.3处理的。船…

开源LivePortrait,快速实现表情包自定义

最近可灵AI很火,看到网上生成的效果也很赞啊,之前发现快手可灵开源了LivePortrait,今天去玩了一下,很有意思。 比如下图官方展示效果: 这些图片开始自带表情了,主要就是通过LivePortrait来实现。 LivePor…

[E二叉树] lc572. 另一棵树的子树(dfs+前中序判断+树哈希+树上KMP+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:572. 另一棵树的子树 2. 题目解析 看到这个题目就感觉不简单,因为写了写 dfs 版本的,发现好像不太会… 还是简单粗暴一点,直接搞一个 前序中序,进行判断即可。我…

【PyTorch】神经风格迁移项目

神经风格迁移中,取一个内容图像和一个风格图像,综合内容图像的内容和风格图像的艺术风格生成新的图像。 目录 准备数据 处理数据 神经风格迁移模型 加载预训练模型 定义损失函数 定义优化器 运行模型 准备数据 创建data文件夹,放入…

数据恢复软件:电脑丢失文件,及时使用数据恢复软件恢复!

数据恢复软件什么时候会用到? 答:如果真的不小心删除文件,清空回收站,电脑重装系统等情况发生,我们要懂的及时停止使用电子设备,使用可靠的数据恢复软件,帮助我们恢复这些电子设备的数据&#…

二进制搭建 Kubernetes v1.20(上)

目录 一、操作系统初始化配置 二、升级Liunx内核 三、部署docker引擎 四、部署etcd集群 五、部署Master组件 六、部署Worker Node组件 hostnameip需要部署k8s集群master0120.0.0.100kube-apiserver kube-controller-manager kube-scheduler etcdk8s集群master0220.0.0.1…

CookieMaker工作室合作开发C++项目十一:拟态病毒

(注:本文章使用了“无标题技术”) 一天,我和几个同事,平台出了点BUG,居然给我刷出了千年杀,同事看得瑕疵欲裂,发誓要将我挫骨扬灰—— (游戏入口:和平精英31.…

【数据脱敏】数据交换平台数据脱敏建设方案

1 概述 1.1 数据脱敏定义 1.2 数据脱敏原则 1.2.1基本原则 1.2.2技术原则 1.2.3管理原则 1.3 数据脱敏常用方法 3.1.1泛化技术 3.1.2抑制技术 3.1.3扰乱技术 3.1.4有损技术 1.4 数据脱敏全生命周期 2 制定数据脱敏规程 3 发现敏感数据 4 定义脱敏规则 5 执…

[Unity] ShaderGraph实现DeBuff污染 溶解叠加效果

本篇是在之前的基础上,继续做的功能衍生。 [Unity] ShaderGraph实现Sprite消散及受击变色 完整连连看如下所示:

TypeError: ‘float’ object is not iterable 深度解析

TypeError: ‘float’ object is not iterable 深度解析与实战指南 在Python编程中,TypeError: float object is not iterable是一个常见的错误,通常发生在尝试对浮点数(float)进行迭代操作时。这个错误表明代码中存在类型使用不…

C基础项目(学生成绩管理系统)

目录 一、项目要求 二、完整代码实例 三、分文件编写代码实例 一、项目要求 1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令 2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提…

嵌入式Linux系统中pinictrl框架基本实现

1. 回顾Pinctrl的三大作用 记住pinctrl的三大作用,有助于理解所涉及的数据结构: * 引脚枚举与命名(Enumerating and naming) * 单个引脚 * 各组引脚 * 引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能 * 引脚配置(Configuration):比如上拉、下拉、open drain、驱…

从零入门 AI for Science(AI+药物) 笔记 #Datawhale AI 夏令营

💖使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset . 魔搭高峰期打不开Task3又换回飞桨了 吧torch 架构换成了 飞桨的paddle 飞桨AI Studio星河社区-人工智能学习与实训社区 https://aistudio.baidu.com/projectdetail/8191835?cont…

Python数据分析案例58——热门游戏数据分析及其可视化

案例背景 有哪个男生不喜欢玩游戏呢?就算上了班儿也要研究一下游戏以及热门的游戏。正好这里有个热门的游戏数据集,全球热门游戏数据集来做一下一些可视化的分析。 数据介绍 该文件包含一个数据集,详细说明了多个平台上的各种流行游戏。每个…

基于ThinkPHP开发的校园跑腿社区小程序系统源码,包含前后端代码

基于ThinkPHP开发的校园跑腿社区小程序系统源码,包含前后端代码 最新独立版校园跑腿校园社区小程序系统源码 | 附教程 测试环境:NginxPHP7.2MySQL5.6 多校版本,多模块,适合跑腿,外卖,表白,二…

Java中的5种线程池类型

Java中的5种线程池类型 1. CachedThreadPool (有缓冲的线程池)2. FixedThreadPool (固定大小的线程池)3. ScheduledThreadPool(计划线程池)4. SingleThreadExecutor (单线程线程池)…

使用 Streamlit 和 Python 构建 Web 应用程序

一.介绍 在本文中,我们将探讨如何使用 Streamlit 构建一个简单的 Web 应用程序。Streamlit 是一个功能强大的 Python 库,允许开发人员快速轻松地创建交互式 Web 应用程序。Streamlit 旨在让 Python 开发人员尽可能轻松地创建 Web 应用程序。以下是一些主…

萱仔大模型学习记录5-langchain实战

前面我的bertlora微调已经跑出了不错的结果,我也学会了如何在bert上使用Lora进行微调,我后续会补充一个医疗意图识别的项目于这个系列,现在这个医疗意图识别代码还暂时不准备公开。我就继续按照我的计划学习一番LangChain。 LangChain是一个用…