openCV实战-系列教程8:直方图与均衡化(直方图定义/mask操作/均衡化原理/均衡化效果/自适应均衡化)、原理解析、源码解读

打印图像直接用这个函数:

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()

1、直方图

1.1 基本定义

图像中的直方图概念,将图像分解成像素点,直方图对像素点进行统计。

如左图读进来一个灰度图,用数值的形式展示出来,直方图就是统计0-255个像素值的分布情况,其中横坐标是0-255的像素值,纵坐标是每个像素值出现的次数。

需要用到这个函数:cv2.calcHist(images,channels,mask,histSize,ranges)

  • images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如**[img]**
  • channels: 同样用中括号括来它会告函数我们统幅图像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0] [1] [2] 它们分别对应着 BGR。
  • mask: 掩码图像。统整幅图像的直方图就把它为 None。但是如果你想统图像某一分的直方图的你就制作一个掩码图像并使用它。
  • histSize:BIN的数目,也就是你需要多少根柱子,函数会自动按照柱子个数将取值范围均匀分布进去,也要用中括号括起来。
  • ranges: 像素值范围常为 [0,256],python左闭右开嘛

所以后面两个参数基本不用改了。

1.2 代码实例

读进来一个小猫的灰度图,获取像素统计信息:

img = cv2.imread('cat.jpg',0) #0表示灰度图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
print(hist.shape)

hist就是一个二维的ndarray,打印结果:

(256, 1)

将这个直方图用matplotlib画出来:

plt.hist(img.ravel(),256); 
plt.show()

打印结果:

将刚刚的小猫图对三个颜色通道都进行统计:

img = cv2.imread('cat.jpg') 
color = ('b','g','r')
for i,col in enumerate(color): histr = cv2.calcHist([img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.xlim([0,256]) 

打印结果:
在这里插入图片描述

2 mask操作

怎样创建一个掩码,以及掩码的定义:

# 创建mast
mask = np.zeros(img.shape[:2], np.uint8)
print (mask.shape)
mask[100:300, 100:400] = 255
cv_show(mask,'mask')

打印结果:

(414, 500)

在这里插入图片描述
这个掩码只有两部分,一部分为黑一部分为白,当把这个掩码图像和原始图像结合在一起的效果就是图三。掩码图像和原始图像大小是一样的,掩码覆盖的地方设置成255,其他地方设置成0,掩码图像和原始图像结合相当于截取操作。

掩码的定义,就是利用np.zeros来定义,大小按照图像长宽的尺寸,然后按照数组的索引范围选择要保存的部位,把要保存的地方全部赋值为255。

把原始图像读进来:

img = cv2.imread('cat.jpg', 0)
cv_show(img,'img')

打印结果:
在这里插入图片描述
将原始图像和掩码图像做与操作:

masked_img = cv2.bitwise_and(img, img, mask=mask)#与操作
cv_show(masked_img,'masked_img')

对带掩码和不带掩码的图像都做一下直方图统计,通过子图的方式进行展示:
在这里插入图片描述

3、直方图的均衡化

如图这个直方图的像素分布特别不均匀,如何让他的像素分布稍微均匀一点呢?
在这里插入图片描述
均衡化的过程就是像素值的分布从左1变成左2,最后的效果是左3
在这里插入图片描述
比如下图的这两个个像素点表格,左边是原始图像,右边是均衡化后的图像。将原来的像素分布用一个固定的计算方法映射到另一个分布:
在这里插入图片描述
这个过程是怎么做的呢?

  1. 将像素值从大到小进行统计,如上图的第三个表格有四个像素值以及个数的统计,根据统计结果,将每个像素对应出现的概率如表格所示计算出来
  2. 按照大小进行计算累积概率。比如像素值为50的有4个,概率为0.25,累积概率仍为0.25,如果是128,有3个,概率为0.1875,累积概率就会加上它自己以及比它小的所有像素的概率,所以是0.4375,依次类推。
  3. 得到所有像素值的累积概率,再乘上像素的取值范围再取整。
    读进来一个小猫的灰度图,获取像素统计信息:
img = cv2.imread('clahe.jpg',0) #0表示灰度图 #clahe
plt.hist(img.ravel(),256); 
plt.show()

打印结果:
在这里插入图片描述
进行均衡化处理:

equ = cv2.equalizeHist(img) 
plt.hist(equ.ravel(),256)
plt.show()

打印结果:
在这里插入图片描述
将均衡化处理前后的图作比较:

res = np.hstack((img,equ))
cv_show(res,'res')

打印结果:
在这里插入图片描述
换成lena的图:
在这里插入图片描述

4、自适应均衡化

均衡化实际上是整体上对像素进行了一个平均的处理操作,这意味着可能会丢失一些细节。那如何避免出现这种情况呢?我们可以将图像分成若干个部分,然后各个部分做自己的均衡化,这样就缓冲了细节的丢失。
在openCV中已经给了我们一些现成的函数来进行这个操作,这就是自适应直方图均衡化。
首先将自适应直方图均衡化的方法生成出来:

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) 

然后将这个自适应方法应用到当前的输出当中,将原始图像、均衡化处理图像、自适应均衡化处理图像都打印出来:

res_clahe = clahe.apply(img)
res = np.hstack((img,equ,res_clahe))
cv_show(res,'res')

打印结果:
在这里插入图片描述
如上图的1、2、3,很显然3图在细节的处理和保留比2要强出很多。

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

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

相关文章

EXCEL的VBA宏密码破解

在Excel 文档中使用AltF11可以打开查看宏代码。而部分VBA宏使用了密码保护,如下图: 在不知道密码的情况下则无法查看到宏代码。 对策 用Emeditor以二进制方式打开文件,搜索[43 4D 47],对应字符为CMG,将找到CMG后的3…

EXCEL密码破解/破解工作表保护密码(详细图文教程)

EXCEL密码破解/破解工作表保护密码(详细图文教程) 网上有很多这个代码,但很多朋友并不太了解如何运用在此做了一些整理,希望对大家有所帮助! 注:很多时候会因为忘记密码丢失重要EXCEL文件而烦恼,这份代码就能帮你找回&…

Excel宏(VBA)密码破解

最近在研究一个Excel宏,想查看VBA代码但是有密码,于是想着能不能移除密码。网上查找一番资料后进行了尝试。 一,准备工具 ExcelHex Editor Neo 二,开始实践 首先将.xlsm后缀名的文件改为.zip文件 然后双击zip文件(不用解压文件…

excel密码破解软件Excel Password Unlocker下载和使用技巧(亲测有效!)

Excel Password Unlocker 5.0 汉化版是专为恢复丢失的 Microsoft Excel 密码设计的一个易于使用的工具。每秒可尝试2万多个密码。 软件授权:免费软件 软件语言:简体中文 软件大小:1.5 MB 系统支持:Winxp / vi…

关于 Camera 预览和录像画质不一样的问题分析

1、问题背景 基于之前安卓平台的一个项目,客户有反馈过一个 Camera app 预览的效果,和录像效果不一致的问题。 这里的预览是指打开 Camera app 后直接出图的效果;录像的效果则是指打开 Camera app 开启录像功能,录制一段视频&…

基于SpringBoot实现MySQL与Redis的数据最终一致性

问题场景 在并发场景下,MySQL和Redis之间的数据不一致性可能成为一个突出问题。这种不一致性可能由网络延迟、并发写入冲突以及异常情况处理等因素引起,导致MySQL和Redis中的数据在某些时间点不同步或出现不一致的情况。数据一致性问题的级别可以分为三…

数据分析基础(1)——超实用‼️Excel 常用函数和实用技巧

学习教程:☑️ 懒人Excel - Excel 函数公式、操作技巧、数据分析、图表模板、VBA、数据透视表教程 目录 一、Excel知识体系✨ 二、Excel 常用函数💡 三、Excel 技巧 🤔 补充: 1、自学数据分析学习路线 2、数据查询网站 一、…

1.Redis 5 环境搭建

一、环境搭建 如果是Centos8,yum 仓库中默认的 Redis版本就是5,直接yum install即可。如果是Centos7,yum 仓库中默认的 Redis版本是3系列,比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…

AD常用快捷键记录

一、通用快捷键 1、放大缩小:常用方法,ctrl鼠标滚轮,鼠标中键移动鼠标,pgup、pgup。 2、切换不同的布线层:ctrlshift鼠标滚轮 3、在SCH或者PCB 同一平面内左右翻转:ctrlX 4、在SCH或者PCB 同一平面内上下…

AD9361常用配置概述

ENSM控制 AD9361的状态控制有两种方式,分别为SPI接口控制和引脚控制,也可以通过SPI接口控制使能状态机跳转。在AD9361的正常工作过程中,包括多种不同状态,分别为:SLEEP(休眠状态)、WAIT&#x…

史上最全的Altium Designer 20安装教程

首先我们下载AD20,下载的链接我放在下面了! AD20.2.3下载链接 下载好了之后,得到下面的镜像文件! 右击镜像文件,解压! 解压后得到如下文件夹: 打开文件夹,右键单击以管理员身份运行…

解决报错: Could not initialize class com.platform.cache.J2CacheUtils

今天运行一个比较久远的SSM项目,访问接口时报错: Could not initialize class com.platform.cache.J2CacheUtils 找了半天也没有发现问题所在,突然发现报错里面有ShiroFilter字样,然后想起以前shiro好像是要跟redis对接&#xff0…

瑞友天翼应用虚拟化系统RCE漏洞复现+利用

1、产品简介 瑞友天翼应用虚拟化系统是西安瑞友信息技术资讯有限公司研发的具有自主知识产权,基于服务器计算架构的应用虚拟化平台。它将用户各种应用软件集中部署在瑞友天翼服务器(群)上,客户端通过WEB即可快速安全的访问经服务器上授权的应用软件&…

Autosar存储入门系列03_NVM状态机及读写存储调用逻辑

本文框架 0.前言1. NVM状态机介绍2. NVM读/写基本逻辑2.1 NVM读操作2.2 NVM写操作2.2.1 实时写2.2.2 下电写 2.3 NVM写入注意事项 0.前言 本系列是Autosar存储入门系列,希望能从学习者的角度把存储相关的知识点梳理一遍,这个过程中如果大家觉得有讲得不…

PC天翼云盘v6.3.4精简版

介绍: 由于天翼云盘网页端不能上传大文件了,需要客户端,于是制作了绿色版,直接打开就能用,装到u盘,走到哪用到哪。 下载不限速,上传文件大小无限制,支持识别MD5秒传。 这是天翼云盘…

如何外网登录访问瑞友天翼应用虚拟化系统?——快解析内网端口映射方案

瑞友天翼应用虚拟化系统(GWT System)是国内具有自主知识产权的应用虚拟化平台,是基于服务器计算(Server-based Computing)的应用虚拟化平台。如何将内网平台提供到互联网上外网访问,是我们比较关注的问题。…

Goby 漏洞更新 | 瑞友天翼应用虚拟化系统 index.php 文件远程代码执行漏洞

漏洞名称: 瑞友天翼应用虚拟化系统 index.php 文件远程代码执行漏洞 English Name:Ruiyou Tianyi Application Virtualization System Index.php File Remote Code Execution Vulnerability CVSS core: 9.3 影响资产数:61711 漏洞描述&am…

[maven]关于pom文件中的<relativePath>标签

关于pom文件中的<relativePath>标签 为什么子工程要使用relativePath准确的找到父工程pom.xml.因为本质继承就是pom的继承。父工程pom文件被子工程复用了标签。&#xff08;可以说只要我在父工程定义了标签&#xff0c;子工程就可以没有&#xff0c;因为他继承过来了&…

IO模型和NGINX安装升级

IO模型和NGINX安装升级 IO模型 IO概念 I/O在计算机中指Input/Output&#xff0c; IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数)&#xff0c;是衡量磁盘性能的主要指标之一。 Linux的IO类型 磁盘I/O 磁盘I/O是进程向内核发起系统调用&#xff0c;请求磁…

EditPlus安装教程

首先官网下载EditPlus&#xff1a;https://www.editplus.com/ 然后直接一直图示安装 &#xff08;也可以放其他盘&#xff09; 最后在下图中输入下面内容&#xff1a; Username: Vovan Regcode: 3AG46-JJ48E-CEACC-8E6EW-ECUAW 大功告成&#xff01;