当前位置: 首页 > news >正文

day31 学习笔记


文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、直方图的定义
  • 二、绘制直方图
  • 三、直方图均衡化
    • 1.自适应直方图均衡化
    • 2.对比度受限的自适应直方图均衡化

前言

  • 通过今天的学习,我掌握了OpenCV中有关直方图均衡化的原理和操作

一、直方图的定义

  • 直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。
  • 直方图:反映图像像素分布的统计图,横坐标就是图像像素的取值,纵坐标是该像素的个数。
  • 增加对比度:简单来说就是让图像黑的更黑,白的更白
  • 直方图一般可以用来统计图像不同像素点的个数

二、绘制直方图

以像素值为横坐标,对应的像素值个数为纵坐标绘制一个直方图

  • hist=cv2.calcHist(images, channels, mask, histSize, ranges)
  • images:输入图像列表,可以是一幅或多幅图像(通常是灰度图像或者彩色图像的各个通道)。
  • channels:一个包含整数的列表,指示在每个图像上计算直方图的通道编号。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。
  • mask(可选):一个与输入图像尺寸相同的二值掩模图像,其中非零元素标记了参与直方图计算的区域,None为全部计算。
  • histSize:一个整数列表,也就是直方图的区间个数(BIN 的数目)。用中括号括起来,例如:[256]。
  • ranges:每维数据的取值范围,它是一个二维列表,每一维对应一个通道的最小值和最大值,例如对灰度图像可能是 [0, 256]
  • 返回值hist 是一个长度为255的数组,数组中的每个值表示图像中对应灰度等级的像素计数

获取直方图的最小值、最大值(这里指的是对应像素点的个数)及其对应最小值的位置索引、最大值的位置索引

  • minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)
def draw(img):# 获取像素点统计信息hist = cv.calcHist([img],[0],None,[256],[0,256])# 获取像素点个数的最值及其索引minVal,maxVal,minloc,maxloc = cv.minMaxLoc(hist)# 创建全黑背景,这里为了兼容性设置为三通道black = np.zeros((256,256,3),np.uint8)# 限制直方图的高high = int(0.9 * 256)# 绘制直方图for i in range(256):# 归一化像素点个数,防止越界# hist[i]仍然是一个数组,要将其中元素取出使用h = int(hist[i].item()/maxVal*high)cv.line(black,(i,256),(i,256-h),(255,0,0),1)# 显示图像cv.imshow('img',back)cv.waitKey(0)cv.destroyAllWindows()

三、直方图均衡化

    • 通俗的讲,就是遍历图像的像素统计出灰度值的个数、比例与累计比例,并重新映射到0-255范围(也可以是其他范围)内
      在这里插入图片描述

1.自适应直方图均衡化

  • 通过调整图像像素值的分布,使得图像的对比度和亮度得到改善。

  • 假设给出某个图像的像素统计表,如下
    在这里插入图片描述

  • 接下来我们就要进行计算,就是将要缩放的范围(通常是缩放到0-255,所以就是255-0)乘以累计比例,得到新的像素值,并将新的像素值放到对应的位置上,比如像素值为50的像素点,将其累计比例乘以255,也就是0.33乘以255得到84.15,取整后得到84,并将84放在原图像中像素值为50的地方
    在这里插入图片描述
    在这里插入图片描述
    tips:这一过程看似会导致相邻像素值在某些情况下更接近,但实际上它增强了全局对比度

  • dst = cv.equalizeHist(imgGray)

  • imgGray为需要直方图均衡化的灰度图,返回值为处理后的图像

img = cv.imread(r"D:\AI\笔记课件\images\zhifang.png",cv.IMREAD_GRAYSCALE)
img1 = cv.equalizeHist(img)
cv.imshow('img',img)
cv.imshow('img1',img1)
cv.waitKey(0)
cv.destroyAllWindows()
  • 该方法没有考虑局部特征和全局对比度的差异,可能导致导致噪点出现或者图像中出现过度增强的区域

2.对比度受限的自适应直方图均衡化

  • 将图像划分为小区域,在每一个小区域内(默认8×8)进行直方图均衡化,以解决局部过度增强的问题

其主要步骤为:

  1. 图像分块(Tiling)
    • 图像首先被划分为多个不重叠的小块(tiles)。这样做的目的是因为在全局直方图均衡化中,单一的直方图无法反映图像各个局部区域的差异性。通过局部处理,AHE能够更好地适应图像内部的不同光照和对比度特性。(tiles 的 大小默认是 8x8)
  2. 计算子区域直方图
    • 对于每个小块,独立计算其内部像素的灰度直方图。直方图反映了该区域内像素值的分布情况。
  3. 子区域直方图均衡化
    • 对每个小块的直方图执行直方图均衡化操作。这涉及重新分配像素值,以便在整个小块内更均匀地分布。均衡化过程会增加低频像素的数量,减少高频像素的数量,从而提高整个小块的对比度。
  4. 对比度限制(Contrast Limiting)
    • 如果有噪声的话,噪声会被放大。为了防止过大的对比度增强导致噪声放大,出现了限制对比度自适应直方图均衡化(CLAHE)。CLAHE会在直方图均衡化过程中引入一个对比度限制参数。当某一小块的直方图在均衡化后出现极端值时,会对直方图进行平滑处理(使用线性或非线性的钳制函数),确保对比度增强在一个合理的范围内。
  5. 重采样和邻域像素融合
    • 由于小块之间是不重叠的,直接拼接经过均衡化处理的小块会产生明显的边界效应。因此,在CLAHE中通常采用重采样技术来消除这种效应,比如通过双线性插值将相邻小块的均衡化结果进行平滑过渡,使最终图像看起来更为自然和平滑。
  6. 合成输出图像
    • 将所有小块均衡化后的结果整合在一起,得到最终的自适应直方图均衡化后的图像。

clahe = cv2.createCLAHE(clipLimit=None, tileGridSize=None)
img = clahe.apply(image)

img = cv.imread(r"D:\AI\笔记课件\images\zhifang.png")
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
img_equal = cv.equalizeHist(img_gray)
clahe = cv.createCLAHE()
img_clahe = clahe.apply(img_gray)
cv.imshow('img_equal',img_equal)
cv.imshow('img_clahe',img_clahe)
cv.waitKey(0)
cv.destroyAllWindows()

THE END

http://www.xdnf.cn/news/103465.html

相关文章:

  • DB-Day11笔记-函数和存储过程面试题讲解
  • 操作系统 : Linux库制作与原理
  • PNG透明免抠设计素材大全26000+
  • DCAN,ECAN和MCAN的区别
  • Vue3 + TypeScript 实现二维码生成与展示
  • 开源AI客户端Cherry Studio本地化部署自建大模型服务在线平台
  • HTML+CSS对角背景变色
  • es-存储与搜索优化
  • 网络编程——通信三要素
  • 文档构建:Sphinx全面使用指南 — 强化篇
  • 常见基础电能
  • docker部署seafile修改默认端口并安装配置onlyoffice实现在线编辑
  • Shader CGInculde(六)
  • 关于日期的一些计算
  • 0-1背包的运算规则
  • 《重塑AI应用架构》系列: Serverless与MCP融合创新,构建AI应用全新智能中枢
  • (09)Vue脚手架的使用(Vite、vue-cli、create-vue)
  • 利用Python爬虫实现百度图片搜索的PNG图片下载
  • C++ 中 std::thread 的高级应用
  • [实战]zynq7000设备树自动导出GPIO
  • 基于 Spring Boot 瑞吉外卖系统开发(六)
  • ElasticSearch深入解析(三):Elasticsearch 7的安装与配置、Kibana安装
  • spark和Hadoop之间的对比与联系
  • 确保电力作业安全:安全工器具的检查与使用指南
  • 比较:AWS VPC peering与 AWS Transit Gateway
  • 云原生后端架构:重塑后端开发的新范式
  • Linux服务器:在ufw防火墙设置这套规则sudo ufw allow from 172.0.0.0/8,为什么容器就可以访问宿主机的服务了?
  • ReAct Agent 实战:基于DeepSeek从0到1实现大模型Agent的探索模式
  • leetcode-哈希表
  • 容器修仙传 我的灵根是Pod 第8章 护山大阵(DaemonSet)