详解OpenCV中直方图,掩膜和直方图均衡化的实现

 更新时间:2022年11月17日 09:32:39   作者:泡泡怡  
这篇文章主要为大家详细介绍了OpenCV中直方图、掩膜、直方图均衡化详细介绍及代码的实现,文中的示例代码讲解详细,需要的可以参考一下

一、图像直方图

1.1 定义

图像直方图是图像的基本属性之一,也是反映图像像素数据分布的统计学特征,其横坐标代表了图像像素点在[0,255]范围中,纵坐标代表图像像素点出现的个数或百分比。如图:

1.2 函数:cv2.calcHist([img1],[channels],mask,histSize,ranges)

img:输入图像

channels:通道,如果输入的是灰度图,则此参数为[0],如果是彩色图,传入参数为[0]或[1]或[2]分别对应BGR。

mask:掩膜统计整幅图的直方图就是None。如果画某一部分直方图,需要制作一个掩模图像并使用。掩模大小和img一样的np数组,需要的部分为255,不需要的部分为0.

histSize:直方图bin的数目,[0,256]所以就是256。

ranges:像素范围[0,256]顾头不顾尾啦。

1.3 代码实现:

(1)准备工作加灰度图显示:

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#显示图像
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.cv2.waitKey(0)
    cv2.destroyAllWindows()
#导入图像
img1=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
hist=cv2.calcHist([img1],[0],None,[256],[0,256])
print(hist.shape)
plt.hist(img.ravel(),256)
plt.show()

结果如图(灰度图):

 (2)彩色图三个不同的通道:

img=cv2.imread("C:/Users/bwy/Desktop/7.png")
cv_show('img',img)
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])

结果如图:

从上面两个图我们就可发现直方图很不均匀,可以比喻成不是矮胖的,所以我们接下来进行图像直方图均衡化。但是,在此之前我们在学习一下掩膜。

二、掩膜(mask)

2.1掩模mask思想:

掩模的大小和原图像大小一致。掩模中只有两部分,0和255,掩模中白色部分覆盖到的区域保留原图,黑色部分覆盖到的区域置为0。如果我们读入彩图,在构建np数组时,需要舍弃第三个维度,即通道。保留前两个维度img.shape[:2],掩模的size和原图像相同。由于mask是一个数组,可以使用切片方法将保留的位置变成白色255。

2.2代码:

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

结果如图:

masked_img=cv2.bitwise_and(img1,img1,mask=mask)
cv_show('masked_img',masked_img)

结果如图:

2.3掩膜过程对比

plt.subplot(221),plt.imshow(img1)
plt.subplot(222),plt.imshow(mask)
plt.subplot(223),plt.imshow(masked_img)
plt.subplot(224),plt.plot(hist_full),plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()

结果如图:

三、直方图均衡化

通过改变图像的直方图,来改变图像中各像素的灰度,用于增强局部的对比度而不影响整体的对比度。这种方法对于背景和前景都太亮或者太暗的图像非常有用。

3.1对图像整体进行均衡化

(1)进行均衡化后直方图前后对比显示:

img=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
plt.hist(img.ravel(),256)
plt.show()
equ=cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()

结果对比图:

(2)进行均衡化后图像前后对比显示:

img=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
equ=cv2.equalizeHist(img)
res=np.hstack((img,equ))
cv_show('res',res)

但是呢,这个方法也存在微瑕,那看一下如果我用下面这张图你就会发现了:

我们会发现这个帅锅的脸太亮了,我们观察不到细节了,细节丢失了,所以这个问题我们如何解决呢?

3.2 自适应均衡化

1、定义:

整幅图像会被分成很多小块,然后再对每一个小块分别进行直方图均衡化。缺点是:如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。

2、代码:

img2=cv2.imread("C:/Users/bwy/Desktop/1.png",0)
img2.shape#(508, 672)
img3=cv2.resize(img2,(400,300))
equ1=cv2.equalizeHist(img3)
clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
res_clahe=clahe.apply(img3)
res=np.hstack((img3,equ1,res_clahe))
cv_show('res',res)

结果如图:

以上就是详解OpenCV中直方图,掩膜和直方图均衡化的实现的详细内容,更多关于OpenCV直方图 掩膜 直方图均衡化的资料请关注脚本之家其它相关文章!

相关文章

  • TensorFlow用expand_dim()来增加维度的方法

    TensorFlow用expand_dim()来增加维度的方法

    今天小编就为大家分享一篇TensorFlow用expand_dim()来增加维度的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python链表类中获取元素实例方法

    python链表类中获取元素实例方法

    在本篇文章里小编给大家整理的是一篇关于python链表类中获取元素实例方法,有兴趣的朋友们可以学习下。
    2021-02-02
  • Python海龟绘图(Turtle)应用指南

    Python海龟绘图(Turtle)应用指南

    python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics)。海龟绘图(turtle库)是python的内部模块,使用前导入即可。本文将展示三个通过海龟绘图实现的小程序,快来跟随小编一起学习吧
    2022-03-03
  • 一文详解如何配置Pycharm进行远程开发

    一文详解如何配置Pycharm进行远程开发

    在搞深度学习的时候,我们在本地开发,但是需要在服务器去运行工程,所以需要使用Pycharm进行远程配置,下面这篇文章主要给大家介绍了关于如何配置Pycharm进行远程开发的相关资料,需要的朋友可以参考下
    2024-02-02
  • Python基础学习之反射机制详解

    Python基础学习之反射机制详解

    在Python中,反射是指通过一组内置的函数和语句,在运行时动态地访问、检查和修改对象的属性、方法和类信息的机制。本文将通过简单的示例和大家讲讲Python中的反射机制,希望对大家有所帮助
    2023-03-03
  • 在Python中使用swapCase()方法转换大小写的教程

    在Python中使用swapCase()方法转换大小写的教程

    这篇文章主要介绍了在Python中使用swapCase()方法转换大小写的教程,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python实现批量文件分类保存的示例代码

    Python实现批量文件分类保存的示例代码

    当我们电脑里面的文本或者或者文件夹太多了,有时候想找到自己想要的文件,只能通过去搜索文件名,这样还是很麻烦的。本文将通过Python语言实现文件批量分类保存,需要的可以参考一下
    2022-04-04
  • python DataFrame的shift()方法的使用

    python DataFrame的shift()方法的使用

    在python数据分析中,可以使用shift()方法对DataFrame对象的数据进行位置的前滞、后滞移动,本文主要介绍了python DataFrame的shift()方法的使用,感兴趣的可以了解一下
    2022-03-03
  • Python趣味挑战之用pygame实现简单的金币旋转效果

    Python趣味挑战之用pygame实现简单的金币旋转效果

    今天教大家怎么用pygame实现简单的金币旋转效果,文中有非常详细的代码示例,对正在学习python的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • python数据分析近年比特币价格涨幅趋势分布

    python数据分析近年比特币价格涨幅趋势分布

    这篇文章主要为大家介绍了python分析近年来比特币价格涨幅趋势的数据分布,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11

最新评论