【python】OpenCV—Histogram(9)

2024-01-10 00:52
文章标签 python opencv histogram

本文主要是介绍【python】OpenCV—Histogram(9),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

学习参考来自

  • 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 pltimg = 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 pltimg = 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 pltimg = 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 pltimg = 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 pltimg = 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()

在这里插入图片描述

这篇关于【python】OpenCV—Histogram(9)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589004

相关文章

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

Python Faker库基本用法详解

《PythonFaker库基本用法详解》Faker是一个非常强大的库,适用于生成各种类型的伪随机数据,可以帮助开发者在测试、数据生成、或其他需要随机数据的场景中提高效率,本文给大家介绍PythonF... 目录安装基本用法主要功能示例代码语言和地区生成多条假数据自定义字段小结Faker 是一个 python

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图