空间域图像增强之直方图均衡的python代码实现——冈萨雷斯数字图像处理

原理

直方图:
图像的直方图是一个图像中像素强度值分布的图表。
对于灰度图像,直方图展示了每个灰度级出现的频率。
直方图均衡步骤:

计算累积分布函数(CDF):首先,计算图像的直方图,然后基于这个直方图生成累积分布函数。CDF是每个强度值及其以下强度值出现频率的累加。
归一化CDF:将CDF归一化到[0, 255](对于8位图像)的范围内,以便它可以映射到标准的灰度级。
映射新的强度值:使用归一化的CDF来映射每个像素的新强度值。
效果:

直方图均衡后,图像的直方图将更加均匀分布。
这通常会增加图像的对比度,特别是在图像的原始直方图中占主导地位的区域。
在这里插入图片描述
应用
直方图均衡广泛应用于医学图像处理、卫星图像增强、以及其他需要改善图像对比度的场景。虽然它是一个强大的工具,但在某些情况下,如包含非常高或非常低的灰度级集中的图像,它可能不会产生理想的结果。在这些情况下,可能需要采用更为复杂的方法,如自适应直方图均衡。

python代码,实现如下图所示的结果:
在这里插入图片描述

提示

用cv2.calcHist函数计算图像的直方图,调用该函数的示例代码如:hist = cv2.calcHist([img], [0], None, [256], [0, 255])。之后可以用cv2.normalize函数将直方图归一化,调用该函数的示例代码如:cv2.normalize(hist, hist)。最后可以用函数cv2.equalizeHist对图像执行直方图均衡化操作,调用该函数的示例代码如:img_equ = cv2.equalizeHist(img)。对暗、亮、低对比度、高对比度四种图像分别做直方图均衡化并观察前后的直方图。注意,plt.imshow会自动扩展灰度图的值域范围,所以为了正确显示前三种视觉效果不佳的图像,需要在imshow时加上参数vmin和vmax,如:axs[i, j].imshow(img, vmin=0, vmax=255, cmap=‘gray’)。直方图用plot而非imshow显示。

代码实现

import cv2
import numpy as np
from matplotlib import pyplot as pltimg_dark = cv2.imread('Fig0316(4).tif', 0)
img_light = cv2.imread('Fig0316(1).tif', 0)
img_low_con = cv2.imread('Fig0316(2).tif', 0)
img_high_con = cv2.imread('Fig0316(3).tif', 0)
img_ori_list = [img_dark, img_light, img_low_con, img_high_con]
img_list = []
hist_list = []for img in img_ori_list:img_list.append(img)hist = cv2.calcHist([img], [0], None, [256], [0, 255])cv2.normalize(hist, hist)hist_list.append(hist)img_equ = cv2.equalizeHist(img)img_list.append(img_equ)hist_equ = cv2.calcHist([img_equ], [0], None, [256], [0, 255])cv2.normalize(hist_equ, hist_equ)hist_list.append(hist_equ)_, axs = plt.subplots(4, 4)for i in range(4):for j in range(2):axs[i, j*2].imshow(img_list[i*2+j], vmin=0, vmax=255, cmap='gray')axs[i, j*2].axis('off')axs[i, j*2+1].plot(hist_list[i * 2 + j])plt.savefig('hist.jpg')
plt.show()

结果展示

111111

总结

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
直方图均衡化通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。直方图均衡技术将原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布, 由于其算法简单, 无需借助外来因素的参数设置,可以自成系统的运行, 有效地增强图像对比度, 是一种常用的图像增强方法. 一直以来, 直方图均衡技术受到各个领域的重视, 比如在消费类电子产品邻域, 在均衡图像的同时希望保持图像的亮度信息。

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

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

相关文章

解决:ERROR: Failed building wheel for xxx

解决:ERROR: Failed building wheel for xxx 文章目录 解决:ERROR: Failed building wheel for xxx背景报错问题报错翻译报错原因解决方法参考内容:今天的分享就到此结束了 背景 在使用之前的代码构建环境时,报错:ERRO…

普中STM32-PZ6806L开发板(有点悲伤的故事续-人灯还未了)

简介 继上篇 普中STM32-PZ6806L开发板(有点悲伤的故事) 说到 关于 普中STM32-PZ6806L开发板的LED流水灯也被烧坏掉了,再也无法玩流水灯, 内心充满了只会流水灯的不甘, 流水灯就是单片机的Hello World,怎么能没有呢? 事情发展 好巧不巧想起最近…

Linux操作系统基础(10):Linux的特殊权限

1. 特殊权限是什么 在Linux中,特殊权限是指针对文件或目录的特殊权限设置,包括SetUID、SetGID和Sticky Bit。 SetUID(Set User ID): 当一个可执行文件被设置了SetUID权限后,当任何用户执行该文件时&#x…

强大好用的低代码开发工具,yyds!

现在市面上的很多开发工具更侧重代码编辑,针对数据库增删改查(CRUD)类的Web系统开发,在界面设计、前后端数据交互等环节主要还是靠写代码,效率比较低;而现在市面上很多所谓的低代码开发平台,大多…

服务器经常出现自动重启怎么办

服务器自动重启是一个复杂且常见的问题,可能由多种原因引起。从硬件故障到软件问题,从电源问题到散热问题,每一个环节都可能成为服务器的杀手。在处理此类问题时,需要我们有一套完整的策略和方案,以便快速准确地定位并…

envoy在arm机器上的编译整理

版本信息: 操作系统:GUN Linux操作系统AARCH64架构。istio-proxy版本:istio-proxy1.15.2 编译环境搭建: 设置代理,确保可以访问Google等外网,这里envoy的第一次编译需要从外网下载依赖库。// 备注:这里一定…

决策树--分类决策树

1、介绍 ① 定义 分类决策树通过树形结构来模拟决策过程,决策树由结点和有向边组成。结点有两种类型:内部结 点和叶结点。内部结点表示一个特征或属性,叶子节点表示一个类。 ② 生成过程 用决策树分类,从根结点开始&#xff…

【自学笔记】01Java基础-09Java关键字详解

介绍java(基于java11)中所有关键字,以及主要重要的关键字详解。 1 Java 11中的关键字: 1.1 类型声明与变量定义 boolean:声明布尔类型变量,只有两个可能值 true 或 false。byte:声明一个8位有…

复制Ubuntu遇到的问题及解决办法、Ubuntu上git命令更改和查看账户、实现Ubuntu与Windows之间的文件共享

1、复制Ubuntu遇到的问题及解决办法 (1)问题一:“该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按”获取所有权(T)”按钮获取它的所有权。否则,请按”取消(C)”按钮以防损坏。” 出现该问题的原因“未正确关闭虚…

关于java栈和堆

关于java栈和堆 在上一篇文章中我们了解了数组的声明和创建,本篇文章中我们了解一下声明数组,创建数组,给数组赋值以后,栈和堆都是怎么样子分配的,了解一下底层的逻辑知识,让大家可以更好的理解数组&#…

后端中的Dao层、Service层、Impl层、utils层、Controller层

Java Dao层 dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查,对外提供稳定访问数据库的方法 Mapper:(DAO) 访问数据库&am…

新品牌在小红书上宣传推广怎么做?

对于新品牌来说,如何在小红书进行有效的宣传推广,成为了一大挑战。本文伯乐网络传媒将为你揭秘新品牌在小红书上的宣传策略,助你牢牢抓住用户流量,提升品牌知名度。 小红书作为一款以内容为核心的社交电商平台,具有极高…

论文阅读:基于MCMC的能量模型最大似然学习剖析

On the Anatomy of MCMC-Based Maximum Likelihood Learning of Energy-Based Models 相关代码:点击 本文只介绍关于MCMC训练的部分,由此可知,MCMC常常被用于训练EBM。最后一张图源于Implicit Generation and Modeling with Energy-Based Mod…

开发知识点-Java网络编程-Netty

Netty P1 Netty-导学分布式网络返回 异步结果dubbo rabbitmqtest 测试案例多线程 日志 第1章_01_nio三大组件-channel-buffer网络编程 框架jdk 1.4 之后才有 nio这个 APIChannel 数据传输通道 (双向)Buffer 内存缓冲区 (暂存Channel 的 数据&…

【React系列】Redux(三) state如何管理

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer: function reducer(state ini…

jdk动态代理与cglib代理区别1

动态代理有jdk动态代理及cglib代理&#xff0c;下面描述jdk动态代理 jdk动态代理 看了 上云 老师的视频&#xff0c;整理下 pom文件 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starte…

JS函数实现数字转中文大写

JS函数实现数字转中文大写 1. 数字转字符,分割,去除空字符2. 遍历分割字符,替换为中文3. 增加四位数单位4. 处理零5. 拼接四位数据和单位 项目中,JS将万亿以下正整数转为中文大写 1. 数字转字符,分割,去除空字符 function toChineseNumber(num){const strs num.toString().re…

2023海内外零知识证明学习资料汇总(一)(故事中的零知识证明篇)

工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面且有知识深度的web3开发工具、web3学习项目…

12 位多通道,支持 MPU 存储保护功能,应用于工业控制,智能家居等产品中的国产芯片ACM32F403/F433

ACM32F403/F433 芯片的内核基于 ARMv8-M 架构&#xff0c;支持 Cortex-M33 和 Cortex-M4F 指令集。芯片内核 支持一整套DSP指令用于数字信号处理&#xff0c;支持单精度FPU处理浮点数据&#xff0c;同时还支持Memory Protection Unit &#xff08;MPU&#xff09;用于提升应用的…

街道洗扫车VR虚拟仿真展示创新了培训方式

吸污车用于收集处理城市中的污水、污泥&#xff0c;起到疏通管道的作用&#xff0c;特别是洪涝灾害时是重要的清理工具。吸污车由于内部结构复杂、工艺原理繁琐且造价成本高&#xff0c;因此传统的吸污车作业培训难以达到满意效果。VR虚拟仿真技术的出现&#xff0c;给企业提供…