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可以对数据进行管理和清洗,包括数据输入、缺失值处理…

Java开发面试--RabbitMQ专区

1、 RabbitMQ 是什么,它的优势和使用场景是什么? 答: RabbitMQ是一种开源的消息代理和队列服务器,它允许应用程序顺序地读写、发送和接收消息。基于Erlang语言开发,支持多种客户端,如Python、Ruby、.NET、…

微软和 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开发及其他各类人员使用。他们通过无代码开发平台快速构建应用,并适应各种需求变化&#…

JDBC基本操作

JDBC基本操作 create table user( id int primary key auto_increment, name varchar(50) ) ENGINE InnoDB DEFAULT CHARSET utf8; JDBC概念 JDBC是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口,定义了用来访问数据库的标准的Jav…

深入理解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…

android APP使用指定网络上网的原理

【精选】Android app 指定网络发送数据包的实现与原理分析_bindprocesstonetwork-CSDN博客 补充&#xff1a; frameworks/base/core/java/android/net/ConnectivityManager.java 函数&#xff1a; bindProcessToNetwork 调用到了 NetworkUtils.bindProcessToNetwork 但是N…

Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7

获取 GPG 密钥失败&#xff1a;[Errno 14] curl#37 - “Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7” 这个就是安装的时候会检查key这个可以再repo文件中关闭即可 $ vim /etc/yum.repos.d/epel.repo 文件内容如下&#xff1a; [epel]nameExtra Packages for…

苹果ios企业签名一个月多少钱?

苹果ios企业签名一个月的费用因签名类型、应用类型等因素而异。 在某些情况下&#xff0c;苹果ios企业签名一个月的费用可能在2000&#xff5e;3000元之间。但也有特殊行业&#xff0c;例如金融行业&#xff0c;其企业签名费用可能会高于这个价格。同时&#xff0c;一些苹果io…

【Android】Hilt比Android好在哪里

Hilt框架的功能和设计理念&#xff0c;和Dagger基本是完全一致的&#xff0c;Hilt也是完全在Dagger基础上进行开发的 但是Dagger的用法比较繁琐&#xff0c;Hilt主要是做了便用性上的改进&#xff0c;主要有以下点 提供常用Component&#xff0c;不用再为每个InjectTarget都创…

创建 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.">…

Android 13.0 无源码app修改它的icon图标

1.概述 在13.0的系统产品rom定制化开发中,有些产品需要对Launcher3中桌面显示的app的icon做替换,如果没有源码的话更换会麻烦点,需要从pms解析app的时候, 可以替换掉app的icon图标就可以了,接下来就来实现相关的功能 2.无源码app修改它的icon图标的相关核心类 framework…