【数字图像处理】3.对比度增强

目录

3.1 灰度直方图

3.2 线性变换

3.3 直方图正规化

3.4 伽马变换

3.5 全局直方图均衡化

3.6 CLAHE


对比度增强是图像增强的一种,它主要解决的是图像的灰度级范围较小造成的对比度较低的问题,目的是将图像的灰度级增强到指定范围,使得图像变清晰。对比度增强:线性变换、分段线性变换、伽马变换、直方图正规化,直方图均衡化,局部自适应直方图均衡化。

3.1 灰度直方图

灰度直方图:是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)  # 颜色变换
hist = cv2.calcHist(gray,[6],None,[155],[120,256])  # 原图、通道、掩模、直方图尺寸(x轴)、像素值范围

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) 
channels,是用于计算直方图的通道,这里使用灰度图计算直方图,所以就直接使用第一个通道。
Mask,图像掩模,没有使用则填写None。
histSize,表示这个直方图分成多少份(即多少个直方柱)。
ranges,表示直方图中各个像素的值,[0.0, 256.0]表示直方图能表示像素值从0.0到256的像素。
accumulate,为一个布尔值,用来表示直方图是否叠加。

  

3.2 线性变换

原理:假设输入图像为I,宽为W,高为H,输出图像为O。

线性变换公式定义:


当a=1,b=0时,O是I的一个副本;当a>1, 增大对比度;当a<1, 对比度的减小。b的值影响亮度:b>0,亮度增加,当b<0,亮度减小。

注:不同数据类型的常数对结果的影响(uint8、float64)uint8是一种无符号8位整数数据类型,它的取值范围是0到255,可以表示的整数数量为256个。float64是一种双精度浮点数数据类型,它的取值范围是从正负1.7976931348623157e+308到正负4.9406564584124654e-324,可以表示的浮点数数量非常大。

histI = cv2.calcHist(I,[0],None,[255],[0,256]) # 原图灰度图
# 线性变换
a = 2
O = float(a)*I
# 进行数据截断,大于255的值要截断为255
O[O>255] = 240
# 数据类型转换
O = np.round(O)
O = O.astype(np.uint8)
histO = cv2.calcHist(O,[0],None,[255],[0,255])  # 线性变换之后灰度图

cv2.calcHist(原图,直方图通道,掩膜,直方图大小,像素值范围,输出直方图=None,是否是累积直方图=None)

直方图通道需要计算直方图的通道,可以是一个整数或整数的列表。例如,如果输入图像是一个三通道的彩色图像,则可以选择计算蓝色通道的直方图、绿色通道的直方图、红色通道的直方图或者所有通道的直方图

掩膜指定感兴趣区域,只对指定区域内部分进行直方图统计,如果不需要则输入 None

③直方图的大小(即直方图的区间数),可以是一个列表或元组,表示每个通道的直方图大小,例如 [256, 256, 256] 表示三个通道的直方图大小均为 256 个区间

像素值的范围,可以是一个列表或元组,表示每个通道的像素值范围,例如 [0, 256, 0, 256, 0, 256] 表示三通道的像素值范围均为 0-255。对于单通道灰度图像,可以省略其中一个 0-256 的范围,例如 [0, 256] 表示像素值范围在 0-255 之间(包含 0 和 255)

 

3.3 直方图正规化

假设输入图像为I,宽为W,高为H,将I出现的最小灰度值记为Imin,最大灰度值记为Imax,为使输出图像)的灰度级范围为[Omin,Omax],I和O的映射为:

 直方图正规化就是一种自动选取a和b值得线性变换方法。

 

histI = cv2.calcHist(I,[0],None,[255],[0,256])
# 求I的最小值和最大值
Imax = np.max(I)
Imin = np.min(I)
# 要输出的最小灰度级和最大灰度级
Omin,Omax = 0,255
# 计算a和b的值
a = float(Omax-Omin)/(Imax-Imin)
b = Omin-a*Imax
# 矩阵的线性变换
O = a*I + b
# 数据类型转换
O = O.astype(np.uint8)
histO = cv2.calcHist(O,[0],None,[255],[0,256])

# 直方图正规化
dst = cv2.normalize(img,255,0,cv2.NORM_MINMAX,cv2.CV_8U)

cv2.normalize(src[, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]])

①src-输入数组

②dst-输出数组,支持原地运算

③alpha-range normalization模式的最小值

④beta-range normalization模式的最大值,不用于norm normalization(范数归一化)模式。

⑤normType-归一化的类型,可以有以下的取值:

    NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

    NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)

    NORM_L1 :  归一化数组的L1-范数(绝对值的和)

    NORM_L2: 归一化数组的(欧几里德)L2-范数

⑥dtype-dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).

⑦mask-操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。

 

 

3.4 伽马变换

图像归一化后得到图像I(r,c),伽马变换就是O(r,c)=I(r,c)^γ, 0<=r<H, 0<=c<W, 当γ=1,图像不变。如果图像整体或者感兴趣区域较暗,令0<γ<1可以增强对比度;如果较亮,则令γ>1,降低对比度。实质上是对图像矩阵中的每一个值进行幂运算。

# 图像归一化
f1 = image/255.0
# 伽马变换
gamma = 0.5
O= np.power(f1,gamma)

 

 

3.5 全局直方图均衡化

直方图均衡化是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。
直方图均衡化的中心思想是把原始图像的的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布。旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。

全局直方图均衡化(HE):可以更好的提高对比度,但是暗区域的噪声可能会放大,变得清晰,而亮区域可能会损失信息。为了提出该问题,采用CLAHE

直方图均衡化的步骤:
第一步:计算图像灰度直方图

第二步:计算灰度直方图的累加直方图

第三步:根据累加直方图的直方图均衡化原理得到输入灰度级和输出灰度级之间的映射关系

第四步:根据第三步得到的灰度级映射关系,循环得到输出图像的每个像素灰度级。

# 全局直方图均衡化
def equalHist(img, z_max = 255): # z_max = L-1 = 255
    # 灰度图像矩阵的高、宽
    H, W = img.shape
    # S is the total of pixels
    S = H * W

    out = np.zeros(img.shape)
    sum_h = 0
    for i in range(256):
        ind = np.where(img == i)
        sum_h += len(img[ind])
        z_prime = z_max / S * sum_h
        out[ind] = z_prime

    out = out.astype(np.uint8)
    return out

image = cv2.imread('../Img/1686370964745.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('image',image)
image1 = equalHist(image)
image2 = cv2.equalizeHist(image,cv2.CV_8UC1)

 

3.6 CLAHE

CLAHE限制对比度的自适应直方图均衡化原理:
1.将图像划分为不重叠的区域块
2.对每个块分别进行直方图均衡化
3.在没有噪声的情况下,每个小区域的灰度直方图会被限制在一个小的灰度级范围内;在有噪声的情况下,每一个分割的区域执行直方图均衡化后,噪声会放大。为了避免出现噪声这种情况,提出限制对比度,如果直方图的bin超过了提前预设好的“限制对比度”,那么就将超出的部分剪裁并均匀分布到其他的bin,这样就重构了直方图。

 

gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=5.0,tileGridSize=(8,8))
dst = clahe.apply(gray)

clipLimit:对比度限制值,控制直方图均衡化的增益大小,范围在 0-1 之间。如果小于等于 0 则表示没有对比度限制,直方图均衡化的结果与原始图像相同;

tileGridSize:每个 tile 的大小,需要保证整个图像被 tile 完全覆盖,通常选择一个正方形的 tile。例如 (8, 8) 表示每个 tile 的大小为 8 像素

 

 

 

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

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

相关文章

实战:用docker-compose容器化springboot项目

文章目录 前言技术积累docker-compose定义docker-compose文件参数docker-compose命令 实战演示1、创建挂载路径2、编写docker-compose.yml3、启动并管理容器 写在最后 前言 前面我们学习和实战了用dockerfile构建镜像&#xff0c;通过镜像可以任意在docker环境容器化部署项目。…

Opencv-C++笔记 (7) : opencv-文件操作XML和YMAL文件

文章目录 一、概述二、文件操作三、打开文件四、写入五、读写个人源码 一、概述 除了图像数据之外&#xff0c;有时程序中的尺寸较小的Mat类矩阵、字符串、数组等 数据也需要进行保存&#xff0c;这些数据通常保存成XML文件或者YAML文件。本小节中将介绍如何利用OpenCV 4中的函…

神经网络:卷积操作

当谈到计算机视觉中的网络模型结构时&#xff0c;卷积操作是其中一个关键的组成部分。卷积操作是一种基于局部区域的操作&#xff0c;它在计算机视觉中用于图像处理和特征提取。 卷积操作的原理如下&#xff1a; 给定一个输入图像和一个称为卷积核&#xff08;或滤波器&#x…

【ARIMA-SSA-LSTM】合差分自回归移动平均方法-麻雀优化-长短期记忆神经网络研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

前端Vue自定义数字输入框 带加减按钮的数字输入框组件

前端Vue自定义数字输入框 带加减按钮的数字输入框组件&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13163 效果图如下&#xff1a; # cc-numbox #### 使用方法 使用方法 <!-- title: 标题 isSetMax: 是否设置最…

synchronized原理

Synchronized能够实现原子性和可见性&#xff1a;在Java内存模型中&#xff0c;synchronized规定&#xff0c;线程在加锁时&#xff0c;先清空工作内存→在主内存中拷贝最新变量的副本到工作内存→执行完代码→将更改后的共享变量的值刷新到主内存中→释放互斥锁。 synchroniz…

Axure教程—折叠面手风琴效果

上文中介绍了用Axure制作折叠面板的基础制作&#xff0c;这次介绍折叠面板手机风琴效果 效果 预览地址&#xff1a;https://e18rf6.axshare.com 功能 点击标题展开内容&#xff0c;点击另一标题&#xff0c;其展开的内容折叠 制作 拖入四个动态面板&#xff0c;分别命名为1、…

【微服务】springboot 通用限流方案设计与实现

目录 一、背景 二、限流概述 2.1 dubbo 服务治理模式 2.1.1 dubbo框架级限流 2.1.2 线程池设置 2.1.3 集成第三方组件 2.2 springcloud 服务治理模式 2.2.1 hystrix 2.2.2 sentinel 2.3 网关层限流 三、常用限流策略 3.1 限流常用的算法 3.1.1 令牌桶算法 3.1.2 …

【深度学习】2-5 神经网络-批处理

批处理&#xff08;Batch Processing&#xff09;是指在深度学习中每次迭代更新模型参数时同时处理多个样本的方式。 批处理时要注意对应维度的元素个数要一致 关于之前手写数字识别的例子&#xff1a; 用图表示&#xff0c;可以发现&#xff0c;多维数组的对应维度的元素个数…

前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮

前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13152 效果图如下&#xff1a; # cc-navHeader #### 使用方法 使用方法 在page.json设…

一种实现Spring动态数据源切换的方法 | 京东云技术团队

1 目标 不在现有查询代码逻辑上做任何改动&#xff0c;实现dao维度的数据源切换&#xff08;即表维度&#xff09; 2 使用场景 节约bdp的集群资源。接入新的宽表时&#xff0c;通常uat验证后就会停止集群释放资源&#xff0c;在对应的查询服务器uat环境时需要查询的是生产库…

实例讲解,一文弄懂workqueue和waitqueue

本期主题&#xff1a; 讲清workqueue和waitqueu&#xff1a; 从中断讲起waitqueue是什么workqueue总结 往期链接&#xff1a; linux设备驱动中的并发linux设备驱动中的编译乱序和执行乱序linux设备驱动之内核模块linux字符驱动linux字符驱动之ioctl部分linux字符驱动之read、…

分布式存储Ceph的部署及应用(创建MDS、RBD、RGW 接口)

系列文章目录 文章目录 系列文章目录一、1.存储基础2. 单机存储的问题3. 分布式存储&#xff08;软件定义的存储 SDS&#xff09; 二 Ceph1.Ceph 简介2. Ceph 数据的存储过程 总结 一、 1.存储基础 1.1 单机存储设备 ●DAS&#xff08;直接附加存储&#xff0c;是直接接到计算…

SAX解析XML返回对应格式的Map对象

前言 最近有一个解析大型xml的需求&#xff0c;xml大小7M&#xff0c;其中xml结构非常复杂&#xff0c;元素各种嵌套 不乏有元素下对象&#xff0c;元素下集合&#xff0c;集合下对象&#xff0c;集合下集合&#xff0c;兄弟不同元素节点&#xff0c;元素下对象下集合&#xff…

HDFS读写流程

读数据流程 客户端向NameNode请求文件的位置&#xff1a;客户端想要访问一个文件时&#xff0c;会向NameNode发送一个请求&#xff0c;要求获取该文件在HDFS上的位置信息。 NameNode将位置信息返回给客户端&#xff1a;NameNode接收到客户端的请求后&#xff0c;会返回该文件所…

设计模式—访问者模式

需求&#xff1a;店铺采购了一批水果&#xff08;苹果及橘子&#xff09;&#xff0c;现在市场监督局来店里检查过期的水果。 public class Fruit {private String name;private Date pickDate;public Fruit(String name, Date pickDate) {this.name name;this.pickDate pic…

javaWeb之cookiesession

1 回顾 1.1 response对象 一次响应封装对象&#xff0c;由服务器创建。使用response对象将服务器需要的数据发送给浏览器。 将数据存放response对象中&#xff0c;tomcat从response对象获得数据&#xff0c;根据数据组织http响应&#xff0c;最后将http响应内容发送给浏览器&…

selenium自动化教程及使用java来爬取数据

目录 一、介绍二、下载浏览器驱动1.获取要下载的驱动版本号2.下载驱动 三、Maven如下四、简单使用五、定位器1.定位器2.说明(1) class name 定位器(2) css selector 定位器(3) id 定位器(4) name 定位器(5) link text 定位器(6) partial link text 定位器(7) tag 定位器(8) xpa…

第8讲:$.ajax方法使用详解

jQuery对象上面定义了Ajax方法&#xff08;$.ajax()&#xff09;&#xff0c;用来处理Ajax操作。调用该方法后&#xff0c;浏览器就会向服务器发出一个HTTP请求。ajax方法有很多属性&#xff0c;但并非每次调用都要使用所有属性&#xff0c;本讲详细介绍了每个属性的作用&#…

windows搭建vue开发环境

参考博客&#xff1a;最详细的vue安装教程_一只野生程序媛的博客-CSDN博客 Vue安装环境最全教程&#xff0c;傻瓜式安装_浪漫主义码农的博客-CSDN博客 1、安装nodejs&#xff0c;从下面官网下载版本&#xff0c;对应安装就行了&#xff1a; Node.js 中文网 2、安装好后&…