opencv库图像基础3直方图-python
opencv库图像基础3直方图-python
直方图是什么
OpenCV 中的直方图是图像中像素值分布情况的统计表示。它是图像空间域内像素值分布的图形表示,以便更好地理解颜色分布。
灰度直方图是图像中每个像素灰度值出现的次数或频数的统计结果。它只反映该图像中灰度值出现的频率,而未反映某一灰度值像素所在的位置。也就是说,它只包含了该图像中某个灰度值的像素出现的概率,而丢失了其所在的位置的信息。 任一幅图像,都能唯一地算出一幅与它对应的直方图。但不同的图像,可能有相同的直方图。
直方图的用处
直方图可以用来分析图像的对比度、亮度和灰度分布。
例如,如果图像的直方图集中在低灰度值区域,则说明图像比较暗;如果图像的直方图集中在高灰度值区域,则说明图像比较亮。
直方图可以用来进行图像增强。例如,可以通过直方图均衡化来提高图像的对比度,使图像更加清晰。
直方图可以用来进行图像分割。例如,可以通过直方图反投影来查找图像中具有特定颜色或灰度值的区域。
直方图可以用来进行图像识别。例如,可以通过比较图像的直方图来识别图像中的对象。
OpenCV 提供了以下函数来计算和绘制直方图:
- cv2.calcHist() 函数用于计算直方图。
- cv2.imshow() 函数用于显示图像。
- cv2.plot() 函数用于绘制直方图。
需要导入的库
# 1 导入库
import cv2
import matplotlib.pyplot as plt
import numpy as np
灰度直方图
创建两个工具函数 显示图片和显示直方图
# 2 方法:显示图片
def show_image(image, title, pos):
# 顺序转换:BGR TO RGB
image_RGB = image[:, :, ::-1] # shape : (height, width, channel)
# 显示标题
plt.title(title)
plt.subplot(2, 3, pos) # 定位
# 2, 3 表示图像将显示在一个 2 行 3 列的网格中,pos 表示图像在网格中的位置。例如,pos=1 表示图像将显示在网格的第 1 行第 1 列。
plt.imshow(image_RGB)
# 3 方法:显示图片的灰度直方图
def show_histogram(hist, title, pos, color):
# 显示标题
plt.title(title)
plt.subplot(2, 3, pos) # 定位图片
plt.xlabel("Bins") # 横轴信息
plt.ylabel("Pixels") # 纵轴信息
plt.xlim([0, 256]) # 范围
plt.plot(hist, color=color) # 绘制直方图
编写主函数
# 4 主函数 main()
def main():
# 5 创建画布
plt.figure(figsize=(15, 6)) # 画布大小
plt.suptitle("Gray Image Histogram", fontsize=14, fontweight="bold") # 设置标题形式
# 6 加载图片
img = cv2.imread("C:\\1.jpg") #这里修改成你自己图像位置
# 7 灰度转换
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 8 计算灰度图的直方图
hist_img = cv2.calcHist([img_gray], [0], None, [256], [0, 256]) #灰度图像这里写0
# 9 展示灰度直方图
# 灰度图转换成BGR格式图片
img_BGR = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2BGR)
show_image(img_BGR, "BGR image", 1)
show_histogram(hist_img, "gray image histogram", 4, "m")
plt.show()
输出效果

在 OpenCV 中,cv2.calcHist() 函数用于计算直方图。它需要传入以下参数:
images:输入图像或图像的数组。
channels:要计算直方图的通道索引。对于灰度图像,该参数为 0。对于彩色图像,该参数可以为 [0, 1, 2],分别表示 R、G、B 三个通道。
mask:掩码图像。如果不使用掩码,则将其设置为 None。
histSize:直方图的大小。它表示直方图中包含的灰度级数。
ranges:直方图的范围。它表示直方图中包含的灰度值范围。
mask
mask在opencv中的作用
在 OpenCV 中,直方图是图像中像素值分布情况的统计表示。它是图像空间域内像素值分布的图形表示,以便更好地理解颜色分布。
mask 是掩码图像。它可以用来指定计算直方图的区域。例如,如果要计算图像中特定区域的直方图,则可以使用掩码图像来指定该区域。
在 OpenCV 中,cv2.calcHist() 函数用于计算直方图。它需要传入 mask 参数。如果 mask 为 None,则表示计算整个图像的直方图。如果 mask 不为 None,则表示计算 mask 指定区域的直方图。
代码
用的两个函数如第一个例子上
def main():
# 5 创建画布
plt.figure(figsize=(12, 7))
plt.suptitle("Gray Image and Histogram with mask", fontsize=4, fontweight="bold")
# 6 读取图片并灰度转换,计算直方图,显示
img_gray = cv2.imread("C://1.png", cv2.COLOR_BGR2GRAY) # 读取并进行灰度转换
img_gray_hist = cv2.calcHist([img_gray], [0], None, [256], [0, 256]) # 计算直方图
show_image(img_gray, "image gray", 1)
show_histogram(img_gray_hist, "image gray histogram", 2, "m")
# 7 创建mask,计算位图,直方图
mask = np.zeros(img_gray.shape[:2], np.uint8)
mask[130:500, 600:1400] = 255 # 获取mask,并赋予颜色
img_mask_hist = cv2.calcHist([img_gray], [0], mask, [256], [0, 256]) # 计算mask的直方图
# 8 通过位运算(与预算)计算带有mask的灰度图片
mask_img = cv2.bitwise_and(img_gray, img_gray, mask = mask)
# 9 显示带有mask的图片和直方图
show_image(mask_img, "gray image with mask", 3)
show_histogram(img_mask_hist, "histogram with masked gray image", 4, "m")
plt.show()
输出效果

彩色直方图
创建三个辅助函数
# 2 方法:显示图片
def show_image(image, title, pos):
plt.subplot(3, 2, pos)
plt.title(title)
image_RGB = image[:, :, ::-1] # BGR to RGB
plt.imshow(image_RGB)
plt.axis("off")
# 3 方法:显示彩色直方图 b, g, r
def show_histogram(hist, title, pos, color):
plt.subplot(3, 2, pos)
plt.title(title)
plt.xlim([0, 256])
for h, c in zip(hist, color): # color: ('b', 'g', 'r')
plt.plot(h, color=c)
# 4 方法:计算直方图
def calc_color_hist(image):
# b, g, r
hist = []
hist.append( cv2.calcHist([image], [0], None, [256], [0, 256]))
hist.append( cv2.calcHist([image], [1], None, [256], [0, 256]))
hist.append( cv2.calcHist([image], [2], None, [256], [0, 256]))
return hist
主函数
# 5 主函数
def main():
# 5.1 创建画布
plt.figure(figsize=(12, 8))
plt.suptitle("Color Histogram", fontsize=4, fontweight="bold")
# 5.2 读取原图片
img = cv2.imread("C://1.png")
# 5.3 计算直方图
img_hist = calc_color_hist(img)
# 5.4 显示图片和直方图
show_image(img, "RGB Image", 1)
show_histogram(img_hist, "RGB Image Hist", 2, ('b', 'g', 'r'))
# 5.5 原始图片中的每个像素增加50个像素值
M = np.ones(img.shape, dtype="uint8") * 50
added_image = cv2.add(img, M) # 像素一一对应相加
added_image_hist = calc_color_hist(added_image)
show_image(added_image, 'added image', 3)
show_histogram(added_image_hist, 'added image hist', 4, ('b', 'g', 'r'))
# 5.6 原始图片中的每个像素减去50个像素值
subtracted_image = cv2.subtract(img, M)
subtracted_image_hist = calc_color_hist(subtracted_image)
show_image(subtracted_image, 'subtracted image', 5)
show_histogram(subtracted_image_hist, 'subtracted image hist', 6, ('b', 'g', 'r'))
plt.show()
输出

opencv库图像基础3直方图-python的更多相关文章
- 实战深度学习(上)OpenCV库
在如今人工智能的浪潮下,无数模拟机器学习和深度学习的开发者工具倍出,其中在计算机图形学和计算机视觉里面最流行的一个库就是OpenCV库了.计算机图形学和计算机视觉学在我们的自动驾驶和仿生机器人当中有着 ...
- python中在计算机视觉中的库及基础用法
基于python脚本语开发的数字图像处理包有很多,常见的比如PIL.Pillow.opencv.scikit-image等.PIL和pillow只提供了基础的数字图像处理,功能有限:OpenCV实际上 ...
- python之opencv库
关于OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C ...
- 使用Python+OpenCV进行图像模板匹配(Match Template)
2017年9月22日 BY 蓝鲸 LEAVE A COMMENT 本篇文章介绍使用Python和OpenCV对图像进行模板匹配和识别.模板匹配是在图像中寻找和识别模板的一种简单的方法.以下是具体的步骤 ...
- 12、OpenCV实现图像的直方图处理
1.直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少.图像的灰度直方图是灰度 ...
- OpenCV(7)-图像直方图
直方图定义可参考这里.图像的直方图用来表示图像像素的统计信息,它统计了图像每一个通道(如果是多通道)中,每个像素的个数(比例). 计算直方图 OpenCV提供了直接计算直方图的函数 void calc ...
- python基础系列教程——Python库的安装与卸载
python基础系列教程——Python库的安装与卸载 2.1 Python库的安装 window下python2.python3安装包的方法 2.1.1在线安装 安装好python.设置好环境变量后 ...
- 小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- Python如何安装OpenCV库
转载:https://blog.csdn.net/weixin_35684521/article/details/81953047 OpenCV的概念可百度,在此不再赘述.https://baike. ...
- Python的Opencv库怎么装
原文章写于时间2019.4 当时鼓捣Opencv库弄了好长时间,前前后后弄了五天,找了好多帖子不知道删除重装了多少次,现在把我试出来正确的方法给大家分享一下. 1.Pycharm 我用的是win10系 ...
随机推荐
- MySQL查询排序和分页
连接数据库 mysql -hlocalhost -uroot -proot 排序查询语法: select 字段列表 from 表名 order by 字段1 排序方式1, 字段3 排序方式2,字段3 ...
- TortoiseGit 合并分支方法
1.首先当前分支 "提交" 并 "推送" 到服务器上,比如开发分支 dev 合并到 master 上 2.右键 > "切换分支" 到要 ...
- Fabric区块链浏览器(2)
本文是区块链浏览器系列的第四篇. 在上一篇文章介绍如何解析区块数据时,使用session对客户端上传的pb文件进行区分,到期后自动删除. 在这片文章中,会着重介绍下认证系统的实现,主要分为三部分: 添 ...
- 开源IM项目OpenIM单聊及万人群压测报告
单聊压测结论: 华为云主机s3一台:8核16G内存,网络带宽10Mb,普通磁盘(非SSD) 同时在线及压测客户端数量:1万 每秒钟发送消息量:2300条: 从发送到对方接收平均消息延时:5秒 群聊压测 ...
- 【3】超级详细matplotlib使用教程,手把手教你画图!(多个图、刻度、标签、图例等)
相关文章: 全网最详细超长python学习笔记.14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了! [1]windows系统如何安装后缀是whl的python库 [2]超级详细Pytho ...
- JuiceFS v1.0 beta2 发布|进一步提升稳定性
这是 JuiceFS v1.0 正式发布前的第二个 beta 版本,共有 16 位社区伙伴贡献了 150+ 次提交 .本次更新以 Bug 修复和稳定性提升为主,辅以大量的文档更新和测试用例优化,并带来 ...
- Python-pymysql查询MySQL的表
一.安装pymysql py -m pip install pymysql; 二.创建表并插入数据 CREATE TABLE `course` ( `course_id` varchar(10) DE ...
- 了解一下基本的http代理配置
我们首先用一个简单例子了解一下基本的http代理配置 worker_processes 1; #nginx worker 数量 error_log logs/error.log; #指定错误日志文件路 ...
- JOISC 2021 记录
Day1 T1 Aerobatics 神秘的提交答案题. Day1 T2 IOI 熱の感染拡大 我们可以通过移动+旋转坐标系,使得第 1 个宫殿在 \((0,0)\) 处,且方向为 \(x\) 轴正方 ...
- 最好的PDF文本编辑开发库
PDF文件是一种常见的文档格式,它具有跨平台.保持原样.安全性高等特点.但是,PDF文件也有一个缺点,就是不可编辑.如果我们想要修改PDF文件中的内容,比如文字.图片.表格等,就会很麻烦,需要转档为W ...