005 OpenCV直方图

目录

一、环境

二、直方图原理概述

三、代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、直方图原理概述

OpenCV是一个广泛使用的开源计算机视觉库,它提供了许多用于图像处理和分析的函数和算法。其中,直方图是一种常用的图像分析工具,它可以用来描述图像的像素值分布情况。OpenCV提供了多种直方图函数,可以生成各种类型的直方图,包括灰度直方图、彩色直方图、积分直方图等。

灰度直方图是描述图像亮度分布的直方图。它显示了每个像素值出现的频率,横轴表示像素值,纵轴表示频率。灰度直方图可以帮助我们了解图像的亮度分布情况,例如图像的对比度和亮度是否合适,是否存在过曝或欠曝等问题。

彩色直方图是描述图像颜色分布的直方图。它显示了每个颜色通道的像素值分布情况,横轴表示像素值,纵轴表示频率。彩色直方图可以帮助我们了解图像的颜色分布情况,例如图像的主要颜色和色彩平衡是否合适,是否存在颜色偏差等问题。

积分直方图是一种扩展了直方图概念的函数,它不仅可以描述像素值的分布情况,还可以描述像素值的累积分布情况。积分直方图的横轴表示像素值,纵轴表示该像素值以下的所有像素值的频率之和。积分直方图可以帮助我们了解图像的整体分布情况,例如图像的整体亮度分布和颜色分布是否合适。

OpenCV中生成直方图的函数包括calcHistcalcHist的改进版本calcHistcompareHist等。其中,calcHist函数可以计算一维或二维直方图,可以应用于灰度图像或彩色图像的直方图计算。compareHist函数可以比较两个直方图,用于识别和比较不同图像的直方图。此外,OpenCV还提供了其他一些函数和算法,例如直方图均衡化、直方图规定化等,可以进一步扩展直方图的应用范围。

总的来说,OpenCV的直方图功能非常强大且灵活,可以应用于各种不同的计算机视觉任务中。通过使用OpenCV的直方图函数和算法,我们可以更好地理解和分析图像数据,提高计算机视觉系统的性能和准确性。

最简代码:

from __future__ import print_function
import cv2 as cv
import argparseparser = argparse.ArgumentParser(description='Code for Histogram Equalization tutorial.')
parser.add_argument('--input', help='Path to input image.', default='lena.jpg')
args = parser.parse_args()src = cv.imread(cv.samples.findFile(args.input))
if src is None:print('Could not open or find the image:', args.input)exit(0)
src = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
dst = cv.equalizeHist(src)
cv.imshow('Source image', src)
cv.imshow('Equalized Image', dst)
cv.waitKey()

三、代码

OpenCV提供了用于计算数组集(通常是图像或分割后的通道)直方图的函数calcHist,该函数支持最高达32维的直方图。在调用calcHist函数时,需要传入一些参数,包括:

  • images:输入数组,通常为图像;
  • channels:指定要计算直方图的通道;如果设置为0,则表示计算所有通道的直方图;
  • mask:掩码图像;
  • histSize:用于表示直方图大小的整数或浮点数;如果设置为整型值(如[16, 16]),则两个值分别代表直方图的高度和宽度。如果是浮点型值(如[16.0, 16.0]),则两个值必须相同且代表直方图的直径;
  • ranges:像素值范围;
  • hist:输出数组;
  • accumulate:布尔类型,用于设置是否将结果累积到输出数组中。

完整代码:

from __future__ import print_function
from __future__ import division
import cv2 as cv
import numpy as np
import argparsedef Hist_and_Backproj(val):bins = valhistSize = max(bins, 2)ranges = [0, 180]## 获取直方图并归一化hist = cv.calcHist([hue], [0], None, [histSize], ranges, accumulate=False)cv.normalize(hist, hist, alpha=0, beta=255, norm_type=cv.NORM_MINMAX)backproj = cv.calcBackProject([hue], [0], hist, ranges, scale=1)cv.imshow('BackProj', backproj)w = 400h = 400bin_w = int(round(w / histSize))histImg = np.zeros((h, w, 3), dtype=np.uint8)for i in range(bins):cv.rectangle(histImg, (i*bin_w, h), ( (i+1)*bin_w, h - int(np.round( hist[i]*h/255.0 )) ), (0, 0, 255), cv.FILLED)cv.imshow('Histogram', histImg)## 读取图片
parser = argparse.ArgumentParser(description='Code for Back Projection tutorial.')
parser.add_argument('--input', help='Path to input image.', default='data/home.jpg')
args = parser.parse_args()src = cv.imread(cv.samples.findFile(args.input))
if src is None:print('Could not open or find the image:', args.input)exit(0)
## 彩色图转到HSV空间
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
ch = (0, 0)
hue = np.empty(hsv.shape, hsv.dtype)
# 由于ch=(0, 0),所有这里就是:将hsv的0通道复制到hue的0通道
cv.mixChannels([hsv], [hue], ch)
## 创建滑条
window_image = 'Source image'
cv.namedWindow(window_image)
bins = 25
cv.createTrackbar('* Hue  bins: ', window_image, bins, 180, Hist_and_Backproj )
Hist_and_Backproj(bins)
## 可视化
cv.imshow(window_image, src)
cv.waitKey()

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

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

相关文章

分享-Spss下载含spss25.spss26.spss27等版本

为了学习spss买的,分享安装程序给大家 SPSS 27是一款用于统计分析和数据挖掘的软件,以下是SPSS 27的功能介绍和配置建议: 功能介绍: 数据管理:SPSS 27可以对数据进行管理和清洗,包括数据输入、缺失值处理…

微软和 OpenAI 的桥段,30 年前的数据库圈也上演过

历史不会重复, 却压着相同的韵脚。 这是一段发生在 30 年前的历史,也是在当时最热的技术领域-数据库,主角之一同样是微软。 论白嫖收购,微软一直是行业内的佼佼者(虽然也发生过收购诺基亚这样的翻车事故)。这也是它基…

自动化测试 —— 元素定位

1.什么是自动化测试 自动化测试的概念:软件自动化测试就是通过测试工具或者其他手段,按照测试人员的预定计划对软件产品进行自动化测试,他是软件测试的一个重要组成部分,能够完成许多手工测试无法完成或者难以实现的测试工作,正确…

9.2 Windows驱动开发:内核解析PE结构导出表

在笔者的上一篇文章《内核特征码扫描PE代码段》中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址,并通过ntimage.h头文件中提供的系列函数解析了指定内核模块的PE节表参数,本章将继续延申这个话题,实现…

如何用CHAT写励志文章?

问CHAT:写一篇以《过了60岁要积极面对身体疾病的坎儿》为题目,写一篇300字励志文章 CHAT回复: 标题:《过了60岁要积极面对身体疾病的坎儿》 人生,有时会像一趟不期而遇的旅程,各自带着乐观或悲观、阳光或…

(论文阅读51-57)图像描述3 53

51.文献阅读笔记(KNN) 简介 题目 Exploring Nearest Neighbor Approaches for Image Captioning 作者 Jacob Devlin, Saurabh Gupta, Ross Girshick, Margaret Mitchell, C. Lawrence Zitnick, arXiv:1505.04467 原文链接 http://arxiv.org/pdf/1…

如何使用无代码系统搭建软件平台?有哪些开源无代码开发平台?

无代码是什么 无代码开发,也称为零代码(Zero Code)开发,是一种技术概念。无代码开发无需代码基础,适合业务人员、IT开发及其他各类人员使用。他们通过无代码开发平台快速构建应用,并适应各种需求变化&#…

深入理解Java虚拟机-GC

深入理解Java虚拟机-GC 当需要排查各种内存溢出、内存泄漏时,当垃圾回收成为系统到达更高并发量的瓶颈时,我们必须对内存动态分配和内存回收技术这样的“自动化”技术采用必要的监控和调节。 Java堆和方法区:一个接口的多个实现类需要的内存…

element表格头部加入图标

首先看看效果 下面是代码 <el-table-column prop"integralBalance"><template slot"header" slot-scope"scope"><div style"display: flex;justify-content: center;align-items: center;">积分余额<i class&qu…

创建 Springboot 项目

前言 创建 Spring Boot 项目是很多Java开发人员入门的重要一步&#xff01; 欢迎来到本篇关于创建 Spring Boot 项目的博客&#xff01;Spring Boot作为一个快速、便捷的开发框架&#xff0c;为我们提供了简化和加速应用程序开发的利器。 在这个数字化时代&#xff0c;快速响…

C语言从入门到实战——数组和指针的强化练习题

数组和指针的强化练习题 前言1. sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析2.1 一维数组2.2 字符数组2.3 二维数组 3. 指针运算笔试题解析3.1 题目1&#xff1a;3.2 题目23.3 题目33.4 题目43.5 题目53.6 题目63.7 题目7 前言…

rabbit MQ的延迟队列处理模型示例(基于SpringBoot死信模式)

说明&#xff1a; 生产者P 往交换机X&#xff08;typedirect&#xff09;会发送两种消息&#xff1a;一、routingKeyXA的消息&#xff08;消息存活周期10s&#xff09;&#xff0c;被队列QA队列绑定入列&#xff1b;一、routingKeyXB的消息&#xff08;消息存活周期40s&#xf…

迪文科技工业串口屏(DMG10600C070-03WTC)更新程序烧录刷机

迪文科技工业串口屏(DMG10600C070-03WTC)更新程序烧录刷机 问题 使用SD卡上电烧录&#xff0c;SD卡文件路径如下&#xff1a; 烧录时&#xff0c;无法写入&#xff0c;成功烧录文件数为0 解决方法 格式化读卡器 格式化脚本 echo off %1 %2 ver|find "5.">…

【Redis篇】简述Redis | 详解Redis命令

文章目录 &#x1f38d;什么是Redis&#x1f38d;Redis特点&#x1f38d;Redis应用场景&#x1f354;Windows安装Redis⭐启动Redis &#x1f33a;Redis数据类型&#x1f33a;Redis常用命令⭐字符串string操作命令⭐哈希hash操作命令⭐列表list操作命令⭐集合set操作命令⭐有序集…

C++实战学习笔记

文章目录 erase()uniquevector的insert()std::string::npos erase() &#xff08;1&#xff09;erase(pos,n); 删除从pos开始的n个字符&#xff0c;比如erase(0,1)就是删除第一个字符 &#xff08;2&#xff09;erase(position);删除position处的一个字符(position是个string类…

linux下流媒体压力测试工具的使用

前言 因为领导要求做linux的推拉流时服务器压力测试&#xff0c;于是在网上找了找。一顿操作下来&#xff0c;发现很多软件盗用一款名为srs-bench的开源软件。 该代码仓库有详细的使用说明&#xff0c;而且可以在issues中找到可能会遇到的问题的解决办法 需要下载该仓库的源…

RK3568开发板在工控工业物联网网关方面的应用

在数字化转型的浪潮中&#xff0c;工控物联网关产品扮演着重要的角色。这些产品通过连接工业设备和网络&#xff0c;为数据传输和分析提供了便利。而迅为RK3568核心板作为一款高性能的芯片&#xff0c;为工控物联网关产品的性能提升和功能扩展提供了强大的支持。 迅为RK3568核心…

基于JAVA+SpringBoot+VUE+微信小程序的前后端分离咖啡小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

2023年约特干故城夜间演艺《万方乐奏有于阗》完美谢幕

11月19日&#xff0c;记者走进约特干故城看到演员在欢乐地跳着刀郎舞和古典舞&#xff0c;庆祝今年以来夜间演艺《万方乐奏有于阗》演出200场完美谢幕。 11月19日在约特干故城&#xff0c;演员正在表演迎宾乐舞。阿卜力克木依卜拉依木摄 当天晚上&#xff0c;城楼上旌旗猎猎&am…

Java-接口

接口 接口 接口就是公共的行为规范,只要实现时符合标准就可以通用. 接口可以看成是: 多个类的公共规范,是一种引用数据类型. 使用关键字interface实现接口. 接口是不能被实例化的. 接口中的成员变量默认是 public static final 接口中只能有抽象方法,当中的方法不写,也是pu…