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

news2024/9/22 5:42:40

一、点运算

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

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

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

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

应用:光度学标定、对比度增强(对比度扩展)、显示标定、轮廓线(例如用点处理进行图像阈值化处理,根据图像的灰度等级把一幅图像划分成一些不连接的区域,这有助于确定图像中对象的边界或定义蒙版)、裁剪(对于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.coloradmin.cn/o/1977092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统|day3.锁、I/O多路复用、中断

协程 概念 协程是微线程,在子程序内部执行,可在子程序内部中断,转而执行别的子程序,在适当的时候再返回来接着执行。 优势 协程调用跟切换比线程效率高:协程执行效率极高。协程不需要多线程的锁机制,可…

项目经验分享:用4G路由器CPE接海康NVR采用国标GB28181协议TCP被动取流一段时间后设备就掉线了

最近我们在做一个生态化养殖的项目时,发现一个奇怪的现象: 项目现场由于没有有线网络,所以,我们在现场IPC接入到海康NVR之后,再通过一款4G的CPE接入到天翼云的国标GB28181视频平台;我们采用UDP协议播放NVR…

BERT模型

BERT模型是由谷歌团队于2019年提出的 Encoder-only 的 语言模型,发表于NLP顶会ACL上。原文题目为:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》链接 在前大模型时代,BERT模型可以算是一个参数量比…

杂记123

(前提已安装了Beyond Compare4)在Everything的文件-右键菜单项里没有Beyond Compare的"选择左边文件进行比较"的现象 进过调查,LZ本机是X64位的,但是安装了x86(32位)的Everything, 切换成X64位的Everything版本就好了

数据结构之《二叉树》(中)

在数据结构之《二叉树》(上)中学习了树的相关概念,还了解的树中的二叉树的顺序结构和链式结构,在本篇中我们将重点学习二叉树中的堆的相关概念与性质,同时试着实现堆中的相关方法,一起加油吧! 1.实现顺序结构二叉树 在…

详细测评下搬瓦工香港CN2 GIA VPS

搬瓦工香港VPS分移动CMI和电信CN2 GIA两个大类,一个属于骨干网,一个属于轻负载。搬瓦工的香港CN2 GIA根据测试来看实际上是CN2 GIABGP,并非三网纯CN2 GIA。详细测评数据如下: 用FIO再给测试一下硬盘I/O,可以仔细看看数…

全网最适合入门的面向对象编程教程:31 Python的内置数据类型-对象Object和类型Type

全网最适合入门的面向对象编程教程:31 Python 的内置数据类型-对象 Object 和类型 Type 摘要: Python 中的对象和类型是一个非常重要的概念。在 Python 中,一切都是对象,包括数字、字符串、列表等,每个对象都有自己的类型。 原文链接: Fre…

WebSocket 协议介绍

前言 一.通用协议设计 参考链接 /* --------------------------------------------------------------- | 魔数 2byte | 协议版本号 1byte | 序列化算法 1byte | 报文类型 1byte | --------------------------------------------------------------- | 状态 1byte | …

前端HTML+CSS查漏补缺——仿制百度搜索首页的一些思考

在像素模仿百度搜索首页的时候,在实现的时候,遇到了一些值得记录的点。 在这个过程中,也顺便看了看百度的源码,感觉很有意思。 对了,QQ截屏里面获取到的颜色,是不大正确的,会有点误差。 这是我…

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

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

Study--Oracle-08-ORACLE数据备份与恢复(一)

一、ORACLE数据保护方案 1、oracle数据保护方案 2、数据库物理保护方案 oracle数据库备份可以备份到本地集群存储,也可以备份到云存储。 3、数据库逻辑数据保护方案 二、ORACLE数据体系 1、ORACLE 数据库的存储结构 2、oracle物理和逻辑存储结构 3、数据库进程 4…

OpenCV||超简略的Numpy小tip

一、基本类型 二、数组属性 三、数组迭代(了解) import numpy as np # 创建一个数组 a np.arange(6).reshape(2, 3) # 使用np.nditer遍历数组 for x in np.nditer(a): print(x) np.nditer有多个参数,用于控制迭代器的行为&#xff…

一层5x1神经网络绘制训练100轮后权重变化的图像

要完成这个任务,我们可以使用Python中的PyTorch库来建立一个简单的神经网络,网络结构只有一个输入层和一个输出层,输入层有5个节点,输出层有1个节点。训练过程中,我们将记录权重的变化,并在训练100轮后绘制…

显示学习5(基于树莓派Pico) -- 彩色LCD的驱动

和这篇也算是姊妹篇,只是一个侧重SPI协议,一个侧重显示驱动。 总线学习3--SPI-CSDN博客 驱动来自:https://github.com/boochow/MicroPython-ST7735 所以这里主要还是学习。 代码Init def __init__( self, spi, aDC, aReset, aCS) :"&…

数据结构(5.4_2)——树和森林的遍历

树的先根遍历(深度优先遍历) 若树非空,先访问根结点,再依次对每棵子树进行先根遍历 树的先根遍历序列和这棵树相应二叉树的先序序列相同。 伪代码: //树的先根遍历 void PreOrder(TreeNode* R) {if (R ! NULL) {visit(R);//访问根结点w…

【WRF安装第四期(Ubuntu)】搭建WRF编译所需系统-WRF和WPS模型的安装

WRF安装第四期:搭建WRF编译所需系统-WRF和WPS模型的安装 1 WRF的编译安装(Building WRF)1.1 进入Build_WRF文件夹1.2 下载WRFV4.01.3 解压WRF安装包1.4 安装WRF选择#1:34选择#2:32 1.5 检查WRF是否安装成功1.5.1 WRF安…

ai文案生成器,文案自动生成好简单

随着科技的不断进步,AI在各个领域中扮演着越来越重要的角色。其中,ai文案生成器的出现给广告和市场营销行业带来了一场革命。曾经需要耗费大量时间和精力的文案创作过程,如今可以通过ai文案生成器轻松自动完成。这一创新技术的出现&#xff0…

什么是药物临床试验?

药物临床试验是指在人体上进行的新药试验研究,旨在确定新药的疗效、安全性、药代动力学和药效学。临床试验不仅帮助确认药物是否对特定疾病或症状有效,还帮助识别和评估药物的副作用和风险。 药物临床试验(Clinical Trial,CT&…

数据结构:带索引的双链表IDL

IDLindexed double list 如图,下方是一个双链表,上方是索引。索引储存为结构体数组,结构体内包括一个指针,和长度。 假设索引只有一个,这时,它应该指向双链表的中间,这样才能提高搜索效率。称…

深入探索可擦除可编程只读存储器(EPROM)DS2502P+TR 1K位只添加存储器

DS2502PT&R产品描述: DS2502PT&R 为1K位只添加存储器,用于识别并存储产品的相关信息。产品批号或特殊的产品信息可以通过最少的接口访问—例如,微控制器的一个端口引脚。DS2502PT&R 具有一个工厂光刻注册码,其中包括…