day35图像处理OpenCV

一、图像预处理

17 直方图均衡化

  • 直方图:反映图像像素分布的统计图,横坐标就是图像像素的取值,纵坐标是该像素的个数。也就是对一张图像中不同像素值的像素个数的统计。
  • 增加对比度:黑的更黑,白的更白。

17.1绘制直方图

就是以像素值为横坐标,像素值的个数为纵坐标绘制一个统计图。

  • 关键3步

  • 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)

    • 参数:hist是上面的返回值数组

    • 返回值:

      • 获取直方图的最小值、最大值及其对应最小值的位置索引、最大值的位置索引
  • cv2.line(img, pt1, pt2, color, thickness)

    • img:原始图像,即要在上面画线的numpy数组(一般为uint8类型)。

    • pt1pt2:分别为线段的起点和终点坐标,它们都是元组类型

    • color:线段的颜色

    • thickness:线段的宽度,默认值是1

示例:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltdef draw():img = cv.imread('./images/lvbo.png')# 统计像素出现的次数hist = cv.calcHist(img, [0], None, [256], [0, 256])print(hist.shape)# 获取最大和最小值的个数 和 索引(在hist数组中)minval, maxval, minloc, maxloc = cv.minMaxLoc(hist)# 创建全黑图像,用于绘制直方图hist_img = np.zeros([256, 256, 3], np.uint8)for i in range(256):# 除最大值:将所有出现的个数归一化(0~1)# 乘0.9*255:将所有个数限制在 0~0.9*255 之间h = int(hist[i].item() / maxval * (0.9*256))cv.line(hist_img,(i, 256),(i, 256-h), (255, 255, 255), 1)cv.imshow('hist', hist_img)cv.waitKey(0)cv.destroyAllWindows()
draw()

17.2直方图均衡化

一副效果好的图像通常在直方图上的分布比较均匀,直方图均衡化就是用来改善图像的全局亮度和对比度。

  • 直方图均衡化作用:
    • 增强对比度
    • 提高图像质量
1. 自适应直方图均衡化

自适应直方图均衡化(Adaptive Histogram Equalization, AHE),通过调整图像像素值的分布,使得图像的对比度和亮度得到改善。

  • 语法:
    • dst = cv.equalizeHist(imgGray)
  • 参数:灰度图

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

优点:方法适用于图像的灰度分布不均匀,且灰度分布集中在更窄的范围,图像的细节不够清晰且对比度较低的情况。

缺点:会出现太亮的部分,会出现特征丢失

  • 示例
img = cv.imread('./images/lvbo.png')
img = cv.resize(img, (256, 256))
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
h = cv.equalizeHist(gray)
cv.imshow('gray', gray)
cv.imshow('h', h)
cv.waitKey(0)
cv.destroyAllWindows()
2. 对比度受限的自适应直方图均衡化

很明显,因为全局调整亮度和对比度的原因,脸部太亮,大部分细节都丢失了。自适应均衡化就是用来解决这一问题的:它在每一个小区域内(默认8×8)进行直方图均衡化。当然,如果有噪点的话,噪点会被放大,需要对小区域内的对比度进行了限制,所以这个算法全称叫:对比度受限的自适应直方图均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)。

其主要步骤为:

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

    • clahe = cv2.createCLAHE(clipLimit=None, tileGridSize=None)

      • clipLimit(可选):对比度限制参数,用于控制直方图均衡化过程中对比度增强的程度。如果设置一个大于1的值(如2.0或4.0),CLAHE会限制对比度增强的最大程度,避免过度放大噪声。如果不设置,OpenCV会使用一个默认值。

      • tileGridSize(可选):图像分块的大小,通常是一个包含两个整数的元组,如(8, 8),表示将图像划分成8x8的小块进行独立的直方图均衡化处理。分块大小的选择会影响到CLAHE的效果以及处理速度。

  • 创建CLAHE对象后,可以使用 .apply() 方法对图像进行CLAHE处理:

    • img=clahe.apply(image)

      • image:要均衡化的图像。

      • img均衡后的图像

3. 示例
import cv2 as cv
import numpy as np
# 绘制直方图的方法
def draw(img):# 统计像素出现的次数hist = cv.calcHist([img], [0], None, [256], [0, 256])# 获取最大和最小值的个数 和 索引(在hist数组中)minval, maxval, minloc, maxloc = cv.minMaxLoc(hist)# 创建全黑图像,用于绘制直方图hist_img = np.zeros([256, 256, 3], np.uint8)for i in range(256):# 除最大值:将所有出现的个数归一化(0~1)# 乘0.9*255:将所有个数限制在 0~0.9*255 之间h = int(hist[i].item() / maxval * (0.9 * 256))cv.line(hist_img, (i, 256), (i, 256 - h), (255, 255, 255), 1)return hist_img
# 均衡化的两个方法
def draw3():img = cv.imread('./images/zhifang.png')gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 绘制灰度图的直方图hts_fray = draw(gray)# 普通的直方图均衡化eqe = cv.equalizeHist(gray)hts_eqe = draw(eqe)# 绘制直方图# 对比度受限的均衡化clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))img_clahe = clahe.apply(gray)hts_clahe = draw(img_clahe) # 绘制CLAHE后的直方图cv.imshow('hts_fray', hts_fray)cv.imshow('hts_eqe', hts_eqe)cv.imshow('hts_clahe', hts_clahe)cv.waitKey(0)cv.destroyAllWindows()
draw3()
  • 输出

在这里插入图片描述

19 模板匹配

未完待续…

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

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

相关文章

【音视频】FFmpeg内存模型

FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候,有两种情况: 两个Packet的buf引用的是同一数据缓存空间,这时候要注意数据缓存空间的释放问题;两个Packet的buf引用不同的数据缓存空间,每个Packet都有数据缓存…

1.2软考系统架构设计师:系统架构的定义与作用 - 练习题附答案及超详细解析

系统架构定义与作用综合知识单选题 题目覆盖核心概念、发展历程、设计原则、评估标准及易混淆点,附答案解析: 1. 系统架构的标准定义源自于以下哪个标准? A. ISO/IEC 9126 B. IEEE 1471-2000 C. TOGAF 9.2 D. ITIL v4 答案:B 简…

go语言对http协议的支持

http:无状态协议,是互联网中使用http使用http实现计算机和计算机之间的请求和响应 使用纯文本方式发送和接受协议数据,不需要借助专门工具进行分析就知道协议中的数据 服务器端的几个概念 Request:用户请求的信息,用…

iscsi服务端安装及配置

1. 安装targetcli软件包 yum install -y targetcli 2. 启动target服务 systemctl start target systemctl enable target 3. 配置防火墙 firewall-cmd --add-port"3260/tcp" 3. 准备一个物理分区(或者逻辑分区)…

解决 MongoDB 查询中的 `InvalidMongoDbApiUsageException` 错误

您在使用 Spring Data MongoDB 时遇到了 InvalidMongoDbApiUsageException 异常,错误信息如下: “由于 com.mongodb.BasicDocument 的限制,您无法添加第二个 ‘null’ 条件。查询已经包含 ‘{ “KaTeX parse error: Expected }, got EOF at e…

一个关于相对速度的假想的故事-4

回到公式, 正写速度叠加和倒写速度叠加的倒写相等,这就是这个表达式所要表达的意思。但倒写叠加用的是减法,而正写叠加用的是加法。当然是这样,因为正写叠加要的是单位时间上完成更远的距离,而倒写叠加说的是单位距离需…

重学React(一):描述UI

背景:React现在已经更新到19了,文档地址也做了全面的更新,上一次系统性的学习还是在16-17的大版本更新。所以,现在就开始重新学习吧~ 学习内容: React官网教程:https://zh-hans.react.dev/lea…

AI大模型:(二)2.3 预训练自己的模型

目录 1.预训练原理 2.预训练范式 1.未标注数据 2.标注数据 3.有正确答案、也有错误答案 3.手撕transform模型 3.1.transform模型代码 3.2.训练数据集 3.3.预训练 3.4.推理 4.如何选择模型

gradle可用的下载地址(免费)

这几天接手一个老项目,想找gradle老版本的,但一搜,虽然在CSDN上搜索出来一堆,但都是收费,有些甚至要几十积分(吃相有点难看了)。 我找了一个能访问的地址,特地分享出来,有需要的自取&#xff01…

vue3新增特性

一、Vue 3 新增特性 1. Composition API 概述: Composition API 提供了一种更灵活和强大的方式来组织和复用逻辑。适用于复杂组件和逻辑复用场景。主要功能: setup 函数:组件的入口点,用于定义响应式数据、方法、生命周期钩子等。响应式 API:ref 和 reactive 提供更细粒度…

前端性能优化全攻略:JavaScript 优化、DOM 操作、内存管理、资源压缩与合并、构建工具及性能监控

1 为什么需要性能优化? 1.1 性能优化的核心价值:用户体验与业务指标 性能优化不仅是技术层面的追求,更是直接影响用户体验和业务成败的关键因素。 用户体验(UX): 响应速度:用户期望页面加载时…

【Unity笔记】Unity + OpenXR项目无法启动SteamVR的排查与解决全指南

图片为AI生成 一、前言 随着Unity在XR领域全面转向OpenXR标准,越来越多的开发者选择使用OpenXR来构建跨平台的VR应用。但在项目实际部署中发现:打包成的EXE程序无法正常启动SteamVR,或者SteamVR未能识别到该应用。本文将以“Unity OpenXR …

Curl用法解析

Curl 用法解析 简介 Curl 是一个强大的命令行工具,主要用于从服务器发送 HTTP 请求并获取数据。它广泛应用于调试 RESTful API、文件上传下载、模拟用户交互等多种场景。下面是一些基本用法及常见参数的分析: 基础用法 curl [options] [URL]其中最基…

C语言教程(十一):C 语言中四种主要作用域及作用域嵌套遮蔽

一、引言 在 C 语言里,作用域指的是程序中变量、函数、类型等标识符能够被使用的范围。C 语言里有四种主要的作用域:块作用域、函数作用域、文件作用域和原型作用域,下面为你展开介绍: 二、块作用域 定义:块作用域是 C…

初次尝试Ghidra

最近看京东读书上有本书叫《Ghidra权威指南》,竟然是美国国家安全局出品的逆向工具,我真是孤陋寡闻,第一次听说。赶紧试试。 Release Ghidra 11.3.2 NationalSecurityAgency/ghidra GitHub 最新版本竟然是上周发布的,看来很活…

乐视系列玩机---乐视2 x620 x628等系列线刷救砖以及刷写第三方twrp 卡刷第三方固件步骤解析

乐视2 x620 x628 x626等,搭载了Helio X20处理器,mtk6797芯片。 通过博文了解💝💝💝 1💝💝💝-----详细解析乐视2 x620系列黑砖线刷救砖的步骤 2💝💝💝----官方两种更新卡刷步骤以及刷写第三方twrp过程与资源 3💝💝💝----乐视2 mtk系列机型救砖 刷…

web原生API AbortController网络请求取消方法使用介绍:防止按钮重复点击提交得最佳方案

在前端开发中,取消网络请求是一个常见的需求,尤其是在用户频繁操作或需要中断长时间请求的场景下。 AbortController 主要用于 ​优雅地管理和取消异步操作: 浏览器原生 API 一、代码解析 1. ​创建 AbortController 实例 const controlle…

2025智能驾驶趋势评估

以下是对2025年智能驾驶趋势的评估: 技术发展 • 自动驾驶级别提升:2025年有望成为L3级自动驾驶的商用元年。L3级自动驾驶技术开始从高端车型向20万元以下价格带下沉,部分车企如江淮和华为合作的尊界S800、小鹏汽车等都在积极推进L3级自动驾驶…

Spring MVC DispatcherServlet 的作用是什么? 它在整个请求处理流程中扮演了什么角色?为什么它是核心?

DispatcherServlet 是 Spring MVC 框架的绝对核心和灵魂。它扮演着前端控制器(Front Controller)的角色,是所有进入 Spring MVC 应用程序的 HTTP 请求的统一入口点和中央调度枢纽。 一、 DispatcherServlet 的核心作用和职责: 请…

Linux 内核中 cgroup 子系统 cpuset 是什么?

cpuset 是 Linux 内核中 cgroup(控制组) 的一个子系统,用于将一组进程(或任务)绑定到特定的 CPU 核心和 内存节点(NUMA 节点)上运行。它通过限制进程的 CPU 和内存资源的使用范围,优…