【python】OpenCV—Histogram(9)

news2024/9/24 23:24:21

在这里插入图片描述

学习参考来自

  • Python下opencv使用笔记(九)(图像直方图)

更多学习笔记可以参考

  • 【python】OpenCV—RGB(1)
  • 【python】OpenCV—Rectangle, Circle, Selective Search(1.2)
  • 【python】OpenCV—Blur, Threshold, Gradient, Morphology(2)
  • 【python】OpenCV—Edge, Corner, Face Detection(3)
  • 【python】OpenCV—findContours(4)
  • 【python】OpenCV—Video to Imag / Image to Video(5)
  • 【python】OpenCV—Brightness and Contrast adjustments(6)
  • 【python】OpenCV—Data Augmentation(7)
  • 【python】OpenCV—Image Pyramid(8)

文章目录

  • 1 直方图
  • 2 局部图片区域的直方图
  • 3 全局直方图均衡化
  • 4 局部直方图均衡化


1 直方图

直方图可以清晰了解图像的整体灰度分布,先看看 opencv 中的接口

cv2.calcHist()
- image输入图像,传入时应该用中括号[]括起来
- channels::传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[]传入。
- mask:掩膜图像。如果统计整幅图,那么为none。主要是如果要统计部分图的直方图,就得构造相应的炎掩膜来计算。
- histSize:灰度级的个数,需要中括号,比如[256]
- ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,比如说你来回各种变换导致像素值负值、很大,则需要调整后才可以。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)  #直接读为灰度图像


# 法一:opencv方法读取-cv2.calcHist(速度最快)
hist_cv = cv2.calcHist([img], [0], None, [256], [0, 256])

# 法二:numpy方法读取-np.histogram()
hist_np, bins = np.histogram(img.ravel(), 256, [0, 256])

# 法三:numpy的另一种方法读取-np.bincount()(速度=10倍法2)
hist_np2 = np.bincount(img.ravel(), minlength=256)

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.plot(hist_cv), plt.title("cv2.calcHist")
plt.subplot(223), plt.plot(hist_np), plt.title("np.histogram")
plt.subplot(224), plt.plot(hist_np2), plt.title("np.bincount")
plt.show()

原图

请添加图片描述

不同接口计算得到的直方图

在这里插入图片描述

2 局部图片区域的直方图

加个 mask 对比看看

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)
mask = np.zeros(img.shape[:2], np.uint8)
mask[25:185, 265:412] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.show()

在这里插入图片描述

蓝色是全图的,黄色是 mask 后的

3 全局直方图均衡化

直方图是对图像对比度效果上的一种处理,旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)
res = cv2.equalizeHist(img)

plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.imshow(res, 'gray')
plt.show()

在这里插入图片描述

上述的直方图均衡化是一种全局意义上的均衡化

4 局部直方图均衡化

下面看看局部均衡化

cv2. createCLAHE()
- clipLimit:颜色对比度的阈值,可选项,默认值 8
- titleGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值 (8,8)

消融下 titleGridSize, 10,20,50

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)
cl0 = cv2.createCLAHE(clipLimit=2, tileGridSize=(10, 10)).apply(img)
c20 = cv2.createCLAHE(clipLimit=2, tileGridSize=(20, 20)).apply(img)
c50 = cv2.createCLAHE(clipLimit=2, tileGridSize=(50, 50)).apply(img)

plt.subplot(221), plt.imshow(img, 'gray'), plt.title("ori")
plt.subplot(222), plt.imshow(cl0, 'gray'), plt.title("CLAHE 10")
plt.subplot(223), plt.imshow(c20, 'gray'), plt.title("CLAHE 20")
plt.subplot(224), plt.imshow(c50, 'gray'), plt.title("CLAHE 50")
plt.show()

在这里插入图片描述
消融下 clipLimit, 2, 4,6

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('2.jpg', 0)
c2 = cv2.createCLAHE(clipLimit=2, tileGridSize=(10, 10)).apply(img)
c4 = cv2.createCLAHE(clipLimit=4, tileGridSize=(10, 10)).apply(img)
c6 = cv2.createCLAHE(clipLimit=6, tileGridSize=(10, 10)).apply(img)

plt.subplot(221), plt.imshow(img, 'gray'), plt.title("ori")
plt.subplot(222), plt.imshow(c2, 'gray'), plt.title("clipLimit 2")
plt.subplot(223), plt.imshow(c4, 'gray'), plt.title("clipLimit 4")
plt.subplot(224), plt.imshow(c6, 'gray'), plt.title("clipLimit 6")
plt.show()

在这里插入图片描述

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

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

相关文章

clickhouse join查询算法

算法对比: 使用方法: SELECT town,max(price) AS max_price,any(population) AS population FROM uk_xxx_paid JOIN uk_xxx_table ON lower(uk_price_paid.town) lower(uk_populations_table.city) GROUP BY town ORDER BY max_price DESC SETTINGS jo…

为什么我建议企业一定要自己的erp管理系统!

在商业世界中,企业就像是一艘船,需要在波涛汹涌的大海中稳稳地航行。然而,如果没有一套有效的管理系统,这艘船就可能迷失方向,甚至触礁沉没。对于那些没有引入ERP系统的企业来说,他们正面临着种种挑战。 信…

搭建储能监控云平台:实现能源管理的智能化

搭建储能监控云平台:实现能源管理的智能化 在全球能源变革的大背景下,储能技术的重要性日益凸显。储能监控云平台作为能源管理的智能解决方案,可以为企业提供全方位的储能系统监控与数据分析,提高能源利用率,降低能源成…

MiniTab的拟合回归模型的分析

拟合回归模型概述 使用拟合回归模型和普通最小二乘法可以描述一组预测变量和一个连续响应之间的关系。可以包括交互作用项和多项式项、执行逐步回归和变换偏斜数据。 例如,房地产评估人员想了解城市公寓与多个预测变量(包括建筑面积、可用单元数量、建…

【算法与数据结构】343、LeetCode整数拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:博主做这道题的时候一直在思考,如何找到 k k k个正整数, k k k究竟为多少合适。…

迈向高效LLM微调:低秩适应(LoRA)技术的原理与实践

在快速发展的人工智能领域中,以高效和有效的方式使用大型语言模型(LLM)变得越来越重要。在本文中,您将学习如何以计算高效的方式使用低秩适应(LoRA)对LLM进行调整! 为什么需要微调?…

【Java数据结构】03-二叉树,树和森林

4 二叉树、树和森林 重点章节,在选择,填空,综合中都有考察到。 4.1 掌握二叉树、树和森林的定义以及它们之间的异同点 1. 二叉树(Binary Tree) 定义: 二叉树是一种特殊的树结构,其中每个节点…

vue-ESlint代码规范及修复

1. 介绍 ESLint:是一个代码检查工具,用来检查你的代码是否符合指定的规则(你和你的团队可以自行约定一套规则)。 在创建项目时,我们使用的是 JavaScript Standard Style 代码风格的规则。 规范网址:https://standardjs.com/rules-zhcn.htm…

街机模拟游戏逆向工程(HACKROM)教程:[2]68K汇编的一些规则

指令中的符号(#,$,%) 在指令中,我们最常见到的符号有#和$。 这其中的"#"符号是告诉汇编程序,这个符号后面的数值为一个立即数,而不是一个偏移值或一个地址。立即数可以理解为"单纯的一个数值"。我们会在后面通过一些实…

Dtop环球嘉年华“全球Web 3.0商业场景应用峰会暨2024战略研讨会”曼谷圆满举办

Dtop环球嘉年华“全球Web 3.0商业场景应用峰会暨2024战略研讨会” (Global Web 3.0 Business Scene Application Summit And 2024 Strategic Symposium)在2024年1月12日于泰国曼谷举办,峰会以“全球Web 3.0商业场景应用生态”为主题&#xff…

vue3中,vue-echarts基本使用(柱状图、饼图、折线图)

注意:vue-echarts在使用前要先安装echarts,不要只安装vue-echarts这一个 echarts官网地址:Apache EChartsApache ECharts,一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互&#xf…

SpringMVC中五种数据提交的方式

单个数据注入:在方法中声明一个和表单提交的参数名称相同的参数,由框架按照名称直接注入。对象封装注入:在方法中声明一个自定义的实体类参数,框架调用实体类中相应的setter方法注入属性值,只要保证实体类中成员变量的…

JAVAEE初阶 多线程进阶(二)

多线程进阶相关知识点 一.CAS1.1 CAS的原子类1.2 实现自旋锁1.3CAS中的ABA问题1.4 ABA问题的解决 二. callable接口三.reentrantLock3.1 reentrantLock与synchronized区别 四.信息量 semaphore五. CountDownLatch六. concurrentHashMap6.1 concurrentHashMap的优点 一.CAS CAS …

【SpringMVC】—— 如何配置使用SpringMVC(详细步骤)

目录 引言 使用 1、新建模块 2、导入坐标 3、创建SpringMVC控制器类 4、初始化SpringMVC环境 5、初始化Servlet容器,加载SpringMVC环境 6、配置运行 引言 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,SpringMVC是表现层(web层)的框架,也…

评职称到底能给你带来什么❓❓

对于个人来说的用处: ①升职加薪 职称等级越高,职位越高,可享受的待遇就越高 ②前置资格 早评职称,前置职称就可以早几年拿,才能更快 评审更高级职称 ③提高个人身份 职称是专业技术人员能力和水平的表现,是…

吼!原来教师这样发布学生期末成绩,轻松没烦恼

​随着科技的进步和教育的不断创新,教师发布学生期末成绩的方式也在逐渐发生变化。传统的方式,如纸质成绩单和口头通知,已经不能满足现代教育的需求。那么,教师应该如何更有效地发布学生期末成绩呢? 一、电子成绩单 电…

Unity | AudioSource 无声音

Unity | AudioSource 无声音 你是否也会遇到相同的问题?AudioSource没声音? 解决: 注意查看一下几处声音设置:

Java多线程——并发和并行、实现方法

多线程 并发和并行 实现方法 代码演示 方式一 package com.qiong.thread1;public class MyThread extends Thread{Overridepublic void run() {for (int i 0; i < 20; i) {System.out.println(getName() "Hello World");}} }package com.qiong.thread1;public…

linux 时间同步后还是偏移

通过crond 设置定时一分钟同步一次时间&#xff1b; 查看日志每次同步都偏移几秒 怀疑是其他程序又做了时间同步&#xff1b; 检查发现有chronyd服务在运行。chronyd也是同步时间的服务 最终解决&#xff1a;关闭chronyd或者用chronyd同步时间 systemctl stop chronydsystemc…

如何优雅地使用Jupyter?基本用法及Jupyter插件使用

Jupyter是一种常用的交互式编辑器&#xff0c;下面我将分享Jupyter的基本用法&#xff0c;以及在日常写代码中使用最多的两个Jupyter插件&#xff0c;一个是JupyterLab&#xff0c;另一个用于给代码生成目录&#xff0c;熟练使用这两个插件&#xff0c;可极大提高我们的代码效率…