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

opencv:直方图

前言

直方图是机器视觉中用于分析图像灰度或颜色分布的重要工具。

基本概念

  • 定义:直方图描述图像中各灰度级像素出现的频率,横轴为灰度级(0-255),纵轴为对应灰度级的像素数量。
  • 性质
    • 反映图像的灰度分布规律,但不包含像素位置信息。
    • 每幅图像有唯一的直方图,但不同图像可能有相同直方图。
    • 若图像由不相连区域组成,总直方图为各区域直方图之和。

应用

  • 图像质量评估:通过直方图分布判断图像亮度和对比度。
  • 阈值选择:在图像分割中,根据直方图峰谷确定二值化阈值。
  • 直方图均衡化:增强图像对比度,使灰度分布更均匀

计算直方图

cv2.calcHist(images,channels,mask,histSize,ranges)

  • images:原图像图像格式为uint8或float32。当传入函数时应用中括号[]括起来例如[img]

  • channels:同样用中括号括起来,它会告函数我们统幅图像的直方图。如果入图像是灰度图它的值就是[0]如果是彩色图像的传入的参数可以是[0][1][2]它们分别对应着BGR。

  • mask:掩码图像。统整幅图像的直方图就把它为None。但是如果你想统图像某一分的直方图的你就制作一个掩码图像并使用它。

  • histSize:BIN 的数目。也应用中括号括起来

  • ranges:像素值范围通常为[0, 256]

# 这是个灰度图
img = cv2.imread("img1.jpg",cv2.IMREAD_GRAYSCALE)
# 直方图计算
hist = cv2.calcHist([img],[0],None,[256],[0,256])
# 绘制直方图显示
plt.hist(img.ravel(),256)
plt.show()

显示RGB三色的直方图:

img = cv2.imread("img1.jpg")
color = ('b', 'g', 'r')
for i, col in enumerate(color):histr = cv2.calcHist([img], [i], None, [256], [0, 256])plt.plot(histr, color=col)plt.xlim([0, 256])

mask操作

掩码操作就是创建一个黑白二值图像,这个二值图像与你想要进行掩码操作的图像大小一致,然后将二值图像与原图像结合,二值图像中白色像素对应的原图像像素点保留,黑色像素对应的原图像像素点变为黑色,从而达到只对部分像素点进行操作的效果。

准确来说,掩码操作就像是做手术前给病人盖上一张手术洞巾,只对洞里的部分进行操作。

img = cv2.imread("img1.jpg", cv2.IMREAD_COLOR)
# 创建mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255    # 将想要处理的部分设置为白色cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

img = cv2.imread("img1.jpg", cv2.IMREAD_COLOR)
# 创建mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255  # 将想要处理的部分设置为白色
# 图像进行‘与’操作,打上掩码
masked_img = cv2.bitwise_and(img, img, mask=mask)cv2.imshow("masked_img", masked_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

直方图均匀化

均匀化效果如上图所示,直方图均匀化是为了提升图像的色彩与亮度。

直方图均匀化,从第二张图可以看出,具体的操作就是从每个像素点之前的灰度值通过某种计算关系映射到另一个灰度值。

具体算法就是将该像素点灰度值的累计概率 x 灰度值的取值范围(0-255),即是映射后的灰度值,然后取整,得到最终的该像素点均匀化后的灰度值。

(累计概率就是自己灰度值的概率加上前一个灰度值的概率)

opencv做图像直方图均匀化

代码非常简单:

img = cv2.imread("img1.jpg", cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)    # 直方图均匀化
plt.hist(equ.ravel(), 256)
plt.show()

但是这种均匀化是整个图进行均匀化,有时候会导致细节丢失,如下图:

那有没有一种方法可以让图像分成“九宫格”(类似),然后每个格子单独均匀化呢?

有的,兄弟,有的,opencv中给了现成的自适应直方图均匀化。

自适应直方图均匀化

img = cv2.imread("img1.jpg", cv2.IMREAD_GRAYSCALE)
# 全图直方图均匀化
equ = cv2.equalizeHist(img)
# 自适应直方图均匀化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
res_clahe = clahe.apply(img)res = np.hstack((img, equ, res_clahe))
cv2.imshow("res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果对比:

http://www.dtcms.com/a/329062.html

相关文章:

  • 【AI论文】GLM-4.5:具备智能体特性、推理能力与编码能力的(ARC)基础模型
  • Visual Studio Code 跨平台快捷键指南:Windows 与 macOS 全面对比
  • 第十三节:后期处理:效果增强
  • 开发避坑指南(24):RocketMQ磁盘空间告急异常处理,CODE 14 “service not available“解决方案
  • 2025年,Javascript后端应该用 Bun、Node.js 还是 Deno?
  • python基于Hadoop的超市数据分析系统
  • 高防CDN和高防IP的各自优势
  • Sklearn 机器学习 异常值检测 孤立深林
  • 《设计模式之禅》笔记摘录 - 15.观察者模式
  • 【完整源码+数据集+部署教程】军事伪装目标分割系统源码和数据集:改进yolo11-EMSC
  • 最新去水印小程序系统 前端+后端全套源码 多套模版 免授权
  • Four.Meme 重大更新:Bonding Curve Cap 从 24 BNB 降至 18 BNB,这意味着什么?
  • 浏览器面试题及详细答案 88道(23-33)
  • 【密码学实战】国密SM2算法介绍及加解密/签名代码实现示例
  • 用了Cursor AI之后,我的编程效率翻倍了?——一位程序员的真实体验分享
  • Java毕业设计选题推荐 |基于SpringBoot的水产养殖管理系统 智能水产养殖监测系统 水产养殖小程序
  • 二层业务端口相关配置
  • STM32H743开发周记问题汇总(串口通讯集中)
  • 免费生成视频,Coze扣子工作流完全免费的视频生成方案,实现图生视频、文生视频
  • Windows 系统 上尝试直接运行 .sh(Shell 脚本)文件
  • 从感知到执行:人形机器人低延迟视频传输与多模态同步方案解析
  • 基于大数据spark的医用消耗选品采集数据可视化分析系统【Hadoop、spark、python】
  • ABP vNext 的工业时间序列治理:InfluxDB vs TimescaleDB 落地对比
  • Python 环境隔离实战:venv、virtualenv 与 conda 的差异与最佳实践
  • Electron自定义菜单栏及Mac最大化无效的问题解决
  • 【自动化运维神器Ansible】playbook变量文件深度解析:实现配置分离与复用
  • JS的学习5
  • 微软正式将GPT-5接入Microsoft Copilot Studio(国际版)
  • 单例模式的理解
  • 【密码学实战】国密TLCP协议简介及代码实现示例