直方图 直方图均衡化

news2024/11/27 6:17:26

直方图

  • 直方图定义
  • mask操作
  • 直方图均衡化
  • 均衡化效果
  • 自适应直方图均衡化

直方图定义

hist = cv2.calcHist(images, channels, mask, histSize, ranges, …) # hist是一个256*1的矩阵,其中每一个值代表了一个灰度值对应的像素点数目

  • images:原图像格式为uint8或float32;当传入函数时应用中括号括起来,如[img]
  • channels:同样用中括号括起来,它会告诉函数要统计直方图的图像通道;如果传入的是灰度图,它的值就是[0],如果传入的是彩色图像,它的值可以是[0]、[1]、[2],分别对应着BGR
  • mask:掩膜图像,如果统计的是整幅图像,它的值就为None
  • histSize:BIN的数目,也应用中括号括起来
  • ranges:像素值范围,一般为[0, 256],左闭右开

plt.hist(x, bins=None, range=None, …) # 直方图,一种特殊的柱状图

  • x:直方图所需数据,必须是一维数组,多维数组可以先扁平化再作图
  • bins:直方图的柱数,即要分成的组数,默认为10
  • range:tuple or None,如果为None,则默认为(x.min(), x.max()),即x轴的范围
import cv2
import matplotlib.pyplot as plt

img = cv2.imread(r'F:/aixin.jpg', 0)  # 0表示灰度图
plt.hist(img.ravel(), 256)  # 横轴表示数值(这里是像素值),纵轴表示一个数值出现的次数;img.ravel()可以将二维矩阵img展平成一维数组
plt.show()

在这里插入图片描述

import cv2
import matplotlib.pyplot as plt

img = cv2.imread(r'F:/aixin.jpg')
color = ('b', 'g', 'r')

for i, col in enumerate(color):
    hist = cv2.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(hist, col)
    plt.xlim([0, 256])

plt.show()

在这里插入图片描述

mask操作

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread(r'F:/aixin.jpg', 0)  # 0表示灰度图
mask = np.zeros(img.shape[:2], np.uint8)  # 创建一个与二维图像shape相同的0值矩阵
mask[350:700, 350:700] = 255  # 将mask的一部分赋值为255,[H, W]
masked_img = cv2.bitwise_and(img, img, mask=mask)  # 与操作

plt.subplot(1, 3, 1)
plt.axis('off')  # 设置无坐标
plt.title('source')
plt.imshow(img, 'gray')  # 以灰度方式呈现

plt.subplot(1, 3, 2)
plt.axis('off')
plt.title('mask')
plt.imshow(mask, 'gray')

plt.subplot(1, 3, 3)
plt.axis('off')
plt.title('masked_img')
plt.imshow(masked_img, 'gray')

plt.show()

在这里插入图片描述

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

plt.plot(hist_full, 'b')
plt.plot(hist_mask, 'g')

plt.show()

在这里插入图片描述

直方图均衡化

图像A的像素分布如下所示:

在这里插入图片描述

均衡化过程:

灰度值像素个数概率累积概率根据函数映射后的灰度值取整
5040.250.250.25*(255-0)=63.7564
12830.18750.43750.4375*(255-0)=111.5625112
20050.31250.750.75*(255-0)=191.25191
25540.2511*(255-0)=255255

均衡化后得到的图像B的像素分布如下所示:

在这里插入图片描述

均衡化效果

import cv2
import matplotlib.pyplot as plt

img = cv2.imread(r'F:/aixin.jpg', 0)  # 0表示灰度图
equ = cv2.equalizeHist(img)  # 均衡化

plt.subplot(1, 2, 1)
plt.title('source')
plt.hist(img.ravel(), 256)

plt.subplot(1, 2, 2)
plt.title('equalized')
plt.hist(equ.ravel(), 256)

plt.show()

在这里插入图片描述

res = cv2.hconcat((img, equ))

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

自适应直方图均衡化

equalizeHist这种全局的均衡化也会存在一些问题,由于整体亮度的提升,可能会使得局部图像的细节变得模糊,因此有时我们需要进行分块的局部均衡化操作,称之为自适应直方图均衡化。

clahe = cv2.createCLAHE(clipLimit=None, tileGridSize=None) # 自适应直方图均衡化
cla = clahe.apply(img)

  • clipLimit:对比度限制阈值
  • tileGridSize:输入图像将被分割成大小相等的矩形块,tileGridSize定义行和列中的块数
img = cv2.imread(r'F:/aixin.jpg', 0)  # 原图
equ = cv2.equalizeHist(img)  # 均衡化(全局均衡化)
clahe = cv2.createCLAHE(clipLimit=2, tileGridSize=(8, 8))  # 自适应均衡化(分块均衡化)
cla = clahe.apply(img)

res = cv2.hconcat((img, equ, cla))

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

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

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

相关文章

医学图像分割的三视图特征学习

文章目录 Triple-View Feature Learning for Medical Image Segmentation摘要本文方法实验结果 Triple-View Feature Learning for Medical Image Segmentation 摘要 深度学习模型,例如监督编码器-解码器风格的网络,在医学图像分割中表现出很好的性能&…

page_dewarp实现弯曲文本矫正

朋友们,如果你使用ocr,再识别的时候会遇到文本扭曲的问题,为了解决这个问题,需要进行弯曲文本矫正,这里推荐一个开源项目,可以使用上面的功能进行矫正,不过里面可能需要改动一些代码&#xff0c…

Python微服务架构设计使用asyncio提升性能

文章目录 1 引言2 微服务概念3 backend-for-frontend 模式4 实施产品列表 API4.1 实现基础服务4.2 实现BFF服务4.3 重试失败的请求4.4 断路器模式 5 总结 1 引言 许多 Web 应用程序都被构建为单体应用程序,单体应用程序通常是包含多个模块的大中型应用程序&#xf…

clickhouse优化使用clickhouse-keeper替代zookeeper

ClickHouse Keeper 是 ZooKeeper 的替代品,与 ZooKeeper 不同,ClickHouse Keeper 是用 C 编写的,并使用 RAFT 算法实现,该算法允许对读写具有线性化能力。 clikhouse-keeper目的在于替换zookeeper,使用clickhouse后&am…

【python】从Ensembl上,根据Array HumanMethylation450甲基化探针cg编号(比如cg13788592)获取位置

文章目录 1. 写在前面2. 手动查找和探索过程从UCSC查找从Ensembl查找 3. 代码实现 1. 写在前面 一篇专利 1 中提到多种癌种及对应的特异性CpG位点,想获取对应cg位点具体的位置或序列。专利中的一组CpG markers如下: 需求就是:将这些cg编号作…

Learning Enriched Features for Fast Image Restoration and Enhancement 论文阅读笔记

这是2022年TPAMI上发表的大名鼎鼎的MIRNetv2,是一个通用的图像修复和图像质量增强模型,核心是一个多尺度的网络 网络结构整体是残差的递归,不断把残差展开可以看到是一些残差块的堆叠。核心是多尺度的MRB。网络用的损失函数朴实无华&#x…

DuDuTalk:智能语音工牌如何赋能销售过程管理?

智能语音工牌是一种智能语音采集设备,配合ASR、NLP、语音分析、文本挖掘等AI技术,它可以帮助企业实现销售过程的监控、分析和改进。在这篇文章中,我们将探讨如何利用录音工牌实现销售过程管理,并介绍其重要性和应用。 1、什么是销…

3.9 JavaDoc生成文档

3.9 JavaDoc生成文档 javadoc命令是用来生成自己API文档的 javadoc是一种技术,他可以将我们的注释信息生成一个帮助文档 参数信息author 作者名version 版本号since 指明需要最早使用的JDK版本param 参数名return 返回值情况throws 异常抛出情况文档注释 /**回车…

接口测试-Jmeter响应数据结果保存到csv文件2种方式(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 日常接口测试&…

阿里巴巴最新总结 Spring Security Oauth2.0 认证授权全彩笔记

Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是 Spring 生态系统中的一员,因此它伴随着整个 Spring 生态系统不断修正、升级,在 Spring Boot 项目中加入 Spring Security 更是十分简单&a…

C语言进阶,第4节-自定义类型详解(结构体

一、 结构体 1. 结构的声明 //描述一个学生 struct Stu//结构体标签 {//成员变量char name[20];int age;char sex[5];char id[20]; }x; //x 为 struct Stu 类型的变量//匿名结构体类型 struct {int a;char c;float f; }a;struct {int a;char c;float f; }*pa;//省略了结构体…

集群基础1——集群概念、LVS负载均衡

文章目录 一、基本了解二、LVS负载均衡2.1 基本了解2.2 工作模式2.2.1 NAT模式2.2.2 DR模式2.2.3 LVS-TUN模式2.2.4 LVS-FULLNAT模式 三、调度器算法四、ipvsadm命令 一、基本了解 什么是集群? 多台服务器做同一件事情。 集群扩展方式: scale up&#xf…

OJ练习第136题——在二叉树中分配硬币

在二叉树中分配硬币 力扣链接:979. 在二叉树中分配硬币 题目描述 给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。 在一次移动中,我们可以选择两个相邻的结点&…

java导出pdf(纯代码实现)

java导出pdf 在项目开发中,产品的需求越来越奇葩啦,开始文件下载都是下载为excel的,做着做着需求竟然变了,要求能导出pdf。导出pdf倒也不是特别大的问题关键就是麻烦。 导出pdf我知道的一共有3中方法: 方法一&#xff…

Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23

Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c20、23 本文全程实操,上机验证通过。 首先查看gcc版本,以确保系统内有gcc,如果没有需要安装sudo apt install gcc 去GUN官网查看最新的gcc版本Index of /gnu/gcc 下载最…

若依添加router-view,使用详细(若依后台管理系统添加router-view)

简介:大家都知道若依后台管理系统,它是一款基于SpringBoot,Spring Security,JWT,Vue & Element 的开发的企业级后台管理系统,可以用于管理企业网站、电子商务平台、移动应用等各种应用系统,…

Shell第四章——函数

命令序列按照格式写在一起 核心:财富使用的命令序列 使用函数可以避免代码重复,函数可以将大的工程分割成若干小的功能模块,提高代码的可读性 第一种写法 第二种写法 return:表示退出函数并返回一个退出值,用…

Android init 进程启动相关分析

目录 1.概述: 2.架构 2.1 Init进程如何被启动? 2.2Init进程启动后,做了哪些事? 3.kernel启动init进程 源码分析 3.1 kernel_init 3.2 do_basic_setup 4. Init 进程启动源码分析 4.1 Init 进程入口 4.2 ueventd_main …

【mysql】—— 数据库的操作

序言: 在上篇文章我已经对数据库进行了详细的介绍,接下来我们就将上手学习操作的细节了。本篇文章便带领大家去学习有关库操作的基本知识!!! 目录 (一)库的操作 1、 创建数据库 2、字符集和…

创新涌动于先,PingCAP 用户峰会 2023 成功举办

2023 年 7 月 13 日,企业级开源分布式数据库厂商 PingCAP 在京成功举办 PingCAP 用户峰会 2023。本届峰会以“创新涌动于先”为主题,PingCAP 全面解析了 AI 时代 TiDB 的演进方向,宣布 TiDB Serverless 正式商用。会上,PingCAP 携…