OpenCv:直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)

news2024/12/24 10:33:12

总结了使用Python OpenCv处理图像直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)的方法。

目录

  • 直方图均衡化(HE)
  • 自适应直方图均衡化(AHE)
  • 限制对比度自适应直方图均衡化(CLAHE)
  • 代码
  • 测试结果
    • 场景1
    • 场景2

直方图均衡化(HE)

HE直方图增强,大家都不陌生,是一种比较古老的对比度增强算法。

通过equalizeHist()可以实现图像的直方图均衡,它是一种全局直方图均衡,考量的对象是整幅图像。

接口形式:

cv2.equalizeHist(src[, dst]) ->dst
参数含义:
src:输入图像,8bit单通道;
dst:均衡后的输出图像,类型同src;

自适应直方图均衡化(AHE)

自适应直方图均衡化(AHE)用来提升图像的对比度的一种计算机图像处理技术。和普通的直方图均衡算法不同,AHE算法通过计算图像的局部直方图,然后重新分布亮度来改变图像对比度。因此,该算法更适合于改进图像的局部对比度以及获得更多的图像细节。缺点是有一个很大的缺陷,就是有时候会过度放大图像中相同区域的噪声。

限制对比度自适应直方图均衡化(CLAHE)

限制对比度的直方图均衡化(CLAHE)的处理方式是先为直方图设置一个阈值,该阈值为限制对比度值,超过该阈值的值会被裁剪,然后裁剪的部分会均匀的分布到其他值上,这样就重构了直方图,接下来就可以用重构后的直方图来进行接下来的均衡化操作了。

CLAHE是对比度抑制自适应直方图均衡(Contrast Limited Adaptive Histogram Equalization)的简称,不同于普通的直方图均衡,它是一种局部直方图均衡方法。

调用接口分两步,先创建实例,再调用apply()方法:

cv2.createCLAHE([, clipLimit[, tileGridSize]]) ->retval
dst=retval.apply(src)
参数含义:
clipLimit:对比对限制阈值,默认为40;
tileGridSize:直方图均衡的栅格尺寸,输入图像将会按照该尺寸分隔后进行局部直方图均衡,默认是8×8大小;
src:输入图像,8bit单通道;
dst:均衡后的输出图像,类型同src;

代码

## 直方图均衡化处理(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化处理
from skimage import exposure
import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
file_to_open = './datasets/INF2Visible_Face_NoGlasses_Original/testA/(2).jpg'  ## 导入图像路径
img = cv2.imread(file_to_open,cv2.IMREAD_GRAYSCALE)
print(type(img))

## 直方图均衡化处理(HE)
img_HE = cv2.equalizeHist(img)

## 自适应直方图均衡化处理(AHE)
img1 = exposure.equalize_adapthist(img)
img_AHE = Image.fromarray(np.uint8(img1 * 255))
img_AHE = np.array(img_AHE)    #PIL.Image.Image转numpy.ndarry

## 限制对比度自适应直方图均衡化处理(CLAHE),也叫局部直方图均衡化处理
clahe = cv2.createCLAHE(clipLimit=2, tileGridSize=(10, 10))
img_CLAHE = clahe.apply(img)   # 将灰度图像和局部直方图相关联, 把直方图均衡化应用到灰度图

plt.rcParams['font.sans-serif']=['SimHei']       #坐标图像中显示中文
plt.rcParams['axes.unicode_minus']=False

plt.figure(figsize=(20,15))    #设置大小
plt.subplot(241)
plt.imshow(img,cmap=plt.cm.gray,vmin=0,vmax=255),plt.axis("off"),plt.title("原始图像")
plt.subplot(245)
plt.hist(img.ravel(), 256), plt.title('原始图像直方图')

plt.subplot(242)
plt.imshow(img_HE,cmap=plt.cm.gray,vmin=0,vmax=255),plt.axis("off"),plt.title("直方图均衡化处理")
plt.subplot(246)
plt.hist(img_HE.ravel(), 256), plt.title('直方图均衡化处理后直方图')

plt.subplot(243)
plt.imshow(img_AHE,cmap=plt.cm.gray,vmin=0,vmax=255),plt.axis("off"),plt.title("自适应直方图均衡化处理")
plt.subplot(247)
plt.hist(img_AHE.ravel(), 256), plt.title('自适应直方图均衡化处理后直方图')

plt.subplot(244)
plt.imshow(img_CLAHE,cmap=plt.cm.gray,vmin=0,vmax=255),plt.axis("off"),plt.title("限制对比度自适应直方图均衡化处理")
plt.subplot(248)
plt.hist(img_CLAHE.ravel(), 256), plt.title('限制对比度自适应直方图均衡化处理后直方图')

plt.show()

测试结果

运行后的对比结果见下:

场景1

在这里插入图片描述

场景2

在这里插入图片描述

以上就是关于直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)的代码及处理对比结果,希望能帮助到你,谢谢!

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

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

相关文章

MySQL 体系结构

MySQL经典体系结构 MySQL连接: MySQL Protocol(MySQL协议) Socket (Unix Scoket)本地连接 比如:mysql -uroot -p123 -S /tmp/mysql.sock TCP/IP(远程连接) 比如:mysql -uroot -p123 -h 10.0.0.51 -P3306 API (应用程序、开发) Native API C、PHP、JDBC、ODBC、.NET、Pyth…

大数据资源整合分析平台_企业大数据管理软件_大数据资源整合管理系统

在现如今大数据时代下,很多公司拥有大量的数据信息,这些数据繁多并且复杂,对于不懂技术的人员来讲,无疑是巨大的难题,这些数据背后存在着巨大的价值,我们可以利用大数据的方式,来提高数据的使用…

戴尔灵越14电脑U盘重装系统方法分享

戴尔灵越14电脑U盘重装系统方法分享。一些用户的戴尔灵越14电脑在进行了系统升级之后,出现了系统不兼容的情况,导致自己的电脑桌面出现了蓝屏的情况。那么这个情况下我们怎么去将系统进行重装呢?一起来看看U盘重装系统的方法吧。 准备工作&am…

详解前端页面性能测试方案——开源工具Lighthouse

相信绝大多数测试同学对于前端页面的性能测试都是通过使用各个浏览器的开发者工具进行抓包来查看响应中各种请求、js和图片的响应时间,然后把发现慢的点进行截图,然后汇总给开发人员。今天给大家介绍一款工具,不仅可以对页面性能进行打分&…

同步、异步、单工、双工、半双工有啥不同

1-同步、异步通信 串行通信通常情况下分为同步和异步通信,同步通信需要同步时钟信号,而异步通信则是不需要同步时钟信号的。 同步通信:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 异步通信:…

物联网架构实例—Ubuntu 安装RabbitMQ

1.安装前准备 1.1.更新apt-get源 apt-get update 1.2.erlang支持 rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang. apt-get install erlang-nox 1.3.查看erlang版本 erl 1.4.添加公钥 wget -O- https://www.rabbitmq.com/rabbitmq-release-…

SQL常用语句

SQL(Structured Query Language) 结构化查询语言,是用来访问和处理数据库的编程语言 使用SQL语言编写出来的代码叫做SQL语句 SQL语言只能在关系型数据库(MySQL,Oracle,SQL Sever)中使用。非关系型数据库(Mongodb)不支持SQL语言 在SQL语句中的关键字无所谓大小写&…

C++泛型算法

泛型算法copy()源码:自实现myCopy()find()源码:自实现myFind()sort()源码:自实现mySort()2个参数3个参数find_if自实现myFind_if()copy() 作用:将某容器的区间数据拷贝到指定指定容器的指定位置 前两个参数是普通的顺序型迭代器…

多线程(java)

1.线程相关概念 1.1程序(program) 是为完成特定任务、用某种语言编写的一组指令的集合。 简单的说:就是我们写的代码 1.2 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷…

前端在线写代码——打造一个自己的编辑器

前端在线写代码——打造一个自己的编辑器前言html格式化css、js格式化List item ) 前言 下载IDE编辑器占用太大,第三方在线编辑空间又给太小,于是乎自己动手开发一个。功能有 1、html格式化 2、css格式化 3、js格式化 4、导入包 5、导出html网页 6、自…

lombok原理

1.更简单的⽇志输出—lombok 每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,这⾥讲⼀种更好⽤的⽇志输出⽅式,使⽤ lombok 来更简单的输出。 添加 lombok 框架⽀持。使⽤ slf4j 注解输出⽇…

终于弄明白了 RocketMQ 的存储模型

RocketMQ 优异的性能表现,必然绕不开其优秀的存储模型 。 这篇文章,笔者按照自己的理解 , 尝试分析 RocketMQ 的存储模型,希望对大家有所启发。 1 整体概览 首先温习下 RocketMQ 架构。 整体架构中包含四种角色 : Producer :消息…

如何快速传输大文件:4 种大文件传输有效的方法

文件大小正在爆炸式增长,随之而来的挑战是如何仍然以快速、安全的方式发送。从这个意义上说,弄清楚如何快速传输大文件似乎是一项几乎不可能完成的任务。随着工作流程不断适应数字化,这对于自由职业者、业余视频编辑、后期制作公司和广播公司…

深挖产品护城河,鹿客科技打开成长天花板

2000-2010年,随着指纹识别技术开始应用于智能门锁,其产品应用领域也开始从酒店推广到普通家庭。2011年以来,随着人脸识别、生物识别技术的兴起,消费者对于产品的需求度不断提升,智能门锁行业也迎来一轮飞跃式发展。来源…

Visual Studio查看虚函数表C++内存模型

在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。 运行程序的话就会…

Git:在实际开发中的使用(够你用十年)

Repository 我们先来认识一下版本库——Repository,接下来我们所有提到的 Git 基础命令,都是基于版本库的。 那么什么是版本库呢?版本库又名仓库,英文名 repository,你可以简单理解成一个目录,这个目录里面…

AcWing 数学知识

质数 模板&#xff1a; // 试除法判断质数 bool is_prime(int x) {if (x < 2) return false;//只需枚举一部分 使得 i< x / i, 时间复杂度为√nfor (int i 2; i < x / i; i )if (x % i 0)return false;return true; }// 试除法分解质因数 void divide(int n) {fo…

免费的 AI 动作捕捉工具 #Rokoko Video

创建动画可能很棘手&#xff0c;但使用对了技术和工具&#xff0c;可以轻松实现看起来很棒且功能流畅的完美动画。“ 为每个创作者配备动捕的力量。”近期&#xff0c;Rokoko 通过推出免费的 AI 动作捕捉工具 Rokoko Video来兑现这一承诺。图片来源 &#xff1a;Rokoko为什么说…

CSS弹性盒子(flexbox)实用指南

CSS弹性盒子&#xff08;flexbox&#xff09;实用指南上一节&#xff1a;《CSS 浮动 及其应用 》| 下一节&#xff1a;《CSS网格布局&#xff08;grid&#xff09;实用指南 》jcLee95&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1…

复习:矩阵计算与自动求导

矩阵计算 矩阵计算就是讲矩阵如何求导数&#xff0c;所有优化模型的求解也是通过求导数实现的。 首先回忆初高中学习的导数知识&#xff0c;这属于标量的导数。 将导数拓展到不可微的情况&#xff0c;这就是亚导数。 将导数拓展到向量&#xff0c;这就是梯度。 向量对向量求…