一、直方图相关学习

news2025/3/13 0:09:30

1、灰度直方图

1.1 基本概念和作用

表示图像中每个灰度级别的像素数量。用于分析图像的亮度分布情况。

1.2 代码示例

参数介绍

hist = cv2.calcHist(images, channels, mask, histSize, ranges, hist, accumulate)

-images:输入图像的列表。对于灰度图像,它只包含一个元素(即一幅图像)。对于彩色图像,通常会传入一个包含所有颜色通道的列表。
-channels:指定要统计直方图的通道。对于灰度图像,值为[0];对于彩色图像,可以传入[0][1][2]分别表示蓝、绿、红通道。如果是彩色图像,也可以同时统计多个通道,例如[0, 1, 2]表示统计所有通道。
-mask:可选参数,用于指定计算直方图的区域。如果不需要指定区域,传入None
-histSize:指定直方图的大小,即灰度级别的个数。对于灰度图像,通常设置为256,表示从0255的灰度级别。对于彩色图像,可以设置为256,表示每个通道的灰度级别。
-ranges:指定像素值的范围。通常为[0, 256],表示灰度级别的范围。对于彩色图像,例如[0, 256, 0, 256, 0, 256]表示三个通道各自的范围。
-hist:可选参数,用于存储计算得到的直方图。如果不提供,函数会返回直方图
-accumulate:

示例

import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('../images/1.jpg', cv2.IMREAD_GRAYSCALE)

# 计算灰度直方图
hist = cv2.calcHist([image], [0], None, [256], [0, 256])

# 显示原图
plt.subplot(2, 1, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')

# 显示灰度直方图
plt.subplot(2, 1, 2)
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')

# 调整子图布局,避免重叠
plt.tight_layout()

# 显示图像和直方图
plt.show()

这里是引用

2、BGR直方图

2.1 基本概念和作用

BGR直方图是一种用于可视化彩色图像中蓝色(Blue)、绿色(Green)和红色(Red)三个通道的像素值分布情况的工具。了解图像中颜色的分布情况。通过分析BGR直方图,可以得知图像中某个颜色通道的强度,从而更好地理解图像的颜色特性。

2.2 代码示例

import cv2
import matplotlib.pyplot as plt

# 读取彩色图像
image = cv2.imread('../images/2.jpg')

# 分离通道
b, g, r = cv2.split(image)

# 计算各通道的直方图
hist_b = cv2.calcHist([b], [0], None, [256], [0, 256])
hist_g = cv2.calcHist([g], [0], None, [256], [0, 256])
hist_r = cv2.calcHist([r], [0], None, [256], [0, 256])

# 显示彩色图像
plt.subplot(2, 1, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')

# 显示BGR直方图
plt.subplot(2, 1, 2)
plt.plot(hist_b, color='blue', label='Blue')
plt.plot(hist_g, color='green', label='Green')
plt.plot(hist_r, color='red', label='Red')
plt.title('BGR Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.legend()

# 调整子图布局,避免重叠
plt.tight_layout()
# 显示图像和直方图
plt.show()

这里是引用

3、灰度直方图均衡

1. 基本概念和作用

用于增强图像对比度的技术,通过调整图像中各个灰度级别的像素分布,使得整个灰度范围更均匀地覆盖,从而提高图像的视觉质量。这个过程可以使暗部和亮部细节更加清晰可见,改善图像的视觉效果。

2. 代码示例

import cv2
import matplotlib.pyplot as plt

# 读取灰度图像
image = cv2.imread('../images/3.jpg', cv2.IMREAD_GRAYSCALE)

# 进行灰度直方图均衡
equalized_image = cv2.equalizeHist(image)

# 显示原始灰度图像
plt.subplot(2, 1, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Grayscale Image')

# 显示均衡后的灰度图像
plt.subplot(2, 1, 2)
plt.imshow(equalized_image, cmap='gray')
plt.title('Equalized Grayscale Image')

# 调整子图布局,避免重叠
plt.tight_layout()

# 显示图像
plt.show()

在这里插入图片描述

4、直方图变换(查找)

4.1 基本概念和作用

直方图变换,也称为直方图查找,是一种用于调整图像对比度的技术。它通过变换图像的灰度级别,将原始图像的灰度分布均匀化,使得图像中所有灰度级别的像素值分布更加平均。这样可以增强图像的对比度,使细节更加突出,提高图像的视觉质量。
直方图变换的核心思想是调整图像中各个灰度级别的像素值,使得灰度值的分布更均匀,从而实现对比度的增强。

4.2 代码示例

# 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)  # 定位
    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("../images/4.jpg")

    # 7 灰度转换
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 8 计算灰度图的直方图
    hist_img = cv2.calcHist([img_gray], [0], None, [256], [0, 256])

    # 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")

    # 10 对图片中的每个像素值增加50个像素
    M = np.ones(img_gray.shape, np.uint8) * 50  # 构建矩阵

    added_img = cv2.add(img_gray, M)
    add_img_hist = cv2.calcHist([added_img], [0], None, [256], [0, 256])  # 计算直方图
    added_img_BGR = cv2.cvtColor(added_img, cv2.COLOR_GRAY2BGR)
    show_image(added_img_BGR, "added image", 2)
    show_histogram(add_img_hist, "added image hist", 5, "m")

    # 11 对图片中的每个像素值减去50个像素
    subtract_img = cv2.subtract(img_gray, M)
    subtract_img_hist = cv2.calcHist([subtract_img], [0], None, [256], [0, 256])  # 计算直方图
    subtract_img_BGR = cv2.cvtColor(subtract_img, cv2.COLOR_GRAY2BGR)
    show_image(subtract_img_BGR, "subtracted image", 3)
    show_histogram(subtract_img_hist, "subtracted image hist", 6, "m")

    plt.show()


if __name__ == '__main__':
    main()

图片中每个像素都增加五十个像素和减少五十像素的效果
在这里插入图片描述

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

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

相关文章

APP端网络测试与弱网模拟

当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等,使…

基于Springboot的新能源充电系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的新能源充电系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

AtCoder Regular Contest 172(仅A题)

A - Chocolate 给N个人分巧克力,分的大小是2^Ai * 2^Ai,给你一个大小为H*W的巧克力,问能不能给N个人都分到要求的巧克力。 假设蓝色是h*w的大巧克力,红色的是要分出来的巧克力(四个角落都一样,这里用左上…

VMware虚拟机安装CentOS7

对于系统开发来说,开发者时常会需要涉及到不同的操作系统,比如Windows系统、Mac系统、Linux系统、Chrome OS系统、UNIX操作系统等。由于在同一台计算机上安装多个系统会占据我们大量的存储空间,所以虚拟机概念应运而生。本篇将介绍如何下载安…

innoDB page页结构详解

Page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最小单位,与数据库相关的所有内容都存储在这种Page结构里。 Page分为几种类型,常见的页类型有数据页(B+tree Node)Undo页(Undo Log Page)系统页(System Page) 事务数据页(Transaction System Page)等 Page 各…

重学Java 15.面向对象.3.数组常用算法

我走过漫漫求学路 大雪落在求知所依靠的心脏上 昨日种种我弃之如敝履 滚滚洪流中,毁灭自己 ——24.2.18 数组常见算法 1.数组翻转 2.冒泡排序 3.二分查找 一、数组翻转 1.概述:数组对称索引位置上的元素互换 2.如何确定数组两端位置? int min…

vue2+高德地图web端开发(二)

前言: 高德地图输入提示与 POI 搜索相关文档:输入提示与 POI 搜索-服务插件和工具-进阶教程-地图 JS API 2.0 | 高德地图API (amap.com) 输入提示-输入提示-示例中心-JS API 2.0 示例 | 高德地图API (amap.com) 创建输入框: 引入Element组…

Selenium Grid分布式测试环境搭建

Selenium Grid简介 Selenium Grid实际上是基于Selenium RC的,而所谓的分布式结构就是由一个hub节点和若干个node代理节点组成。Hub用来管理各个代理节点的注册信息和状态信息,并且接受远程客户端代码的请求调用,然后把请求的命令转发给代理节…

猫头虎分享:一文带你搞懂什么是SaaS、PaaS、LaaS、CaaS、FaaS、MBaaS

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

拿捏c语言指针(中)

前言 书接上回 拿捏c语言指针(上) 此篇主要讲解的是指针与数组之间的爱恨情仇,跟着我的脚步一起来看看吧~ 创造不易,可以帮忙点点赞吗 如有差错,欢迎指出 理解数组名 数组名是首元素地址 例外 1.sizeof&#xff0…

《苍穹外卖》知识梳理P11-Apache POI导出报表

一.Apache POI 可以通过Apache POI处理excel文件&#xff0c;核心操作是读和写 应用场景 银行网银交易明细各种业务系统导出Excel报表批量导入业务数据 使用步骤 1.导入maven坐标 <dependency><groupId>org.apache.poi</groupId><artifactId>poi&…

萝卜大杂烩 | 把微信接入ChatGPT,变成聊天机器人竟然这么简单!(一起来尝试吧~)

本文来源公众号“萝卜大杂烩”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;把微信接入ChatGPT&#xff0c;变成聊天机器人竟然这么简单&#xff01; 最近的 ChatGPT 又再次火热起来了&#xff0c;各种周边工具也是层出不穷&…

力扣72. 编辑距离(动态规划)

Problem: 72. 编辑距离 文章目录 题目描述思路复杂度Code 题目描述 思路 由于易得将字符串word1向word2转换和word2向word1转换是等效的&#xff0c;则我们假定统一为word1向word2转换&#xff01;&#xff01;&#xff01; 1.确定状态&#xff1a;我们假设现在有下标i&#x…

SQL补充2:数据库的增操作

数据库的增操作 数据库的增操作主要涉及数据库的增加、数据表的增加、表记录增加以及表字段增加等&#xff1a; 数据库的增加非常简单&#xff0c;就是新创建一个数据库&#xff1b;表记录的增加指的就是新增表的数据行&#xff0c;可以是在已有表的基础上增加记录&#xff0…

菜刀HTTPTCP后门分析+防范

本文由掌控安全学院 - aj545302905 投稿 “菜刀”对于渗透测试者来说耳熟能详&#xff0c;但是大家用的菜刀真的安全吗&#xff1f;你能保证你所使用的工具不会被别人偷偷的塞入后门吗&#xff1f; 如果菜刀中被塞入后门 那我们岂不是成了别人的苦力。辛辛苦苦打下的shell就这…

简单介绍数据结构的基本概念

数据结构的基本概念 常用术语 数据 数据&#xff08;Data&#xff09;是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号的总称。例如&#xff1a;整数、字符串、图形、图像、声音和动画等 数据元素 数据元素&#xff08;Data Element&…

基于SSM的宁夏旅游网站平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的宁夏旅游网站平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

解决updatexml和extractvalue查询显示不全

报错注入是一种常见的SQL 注入方式&#xff0c;通过注入代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 updatexml和extractvalue updatexml和extractvalue 是常用的两个报错注入函数 http://localhost/sqli/Less-5/?id1%27and%20updat…

树莓派登录方式

目录 1.串口登录树莓派 1.1 USB-TTL连接树莓派串口 1.2 修改系统配置&#xff0c;启用串口登录树莓派 1.3 启动树莓派 2.网络方式登录树莓派 2.1 使树莓派接入网络 2.2 网络SSH 方式登录树莓派 2.2.1 打开ssh功能&#xff0c; 输入命令&#xff1a; 1.串口登录树莓派 1…

循环语句及对应练习

一、循环语句 echo命令 echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符 选项作用\r光标移至行首&#xff0c;并且不换行\s当前shell的名称&#xff0c;如bash\t插入Tab键&#xff0c;制表符\n输出换行\f换行&#xff0c;但光标仍停留在原处\表示插入“\”本身…