直方图绘制与直方图均衡化实现

一,直方图的绘制

1.直方图的概念:

在图像处理中,经常用到直方图,如颜色直方图、灰度直方图等。
图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所
占的多少。
图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横
坐标是灰度级,纵坐标是该灰度级出现的频率。
(简洁来说:就是描述图像中各个灰度级的个数)
在这里插入图片描述
直方图反映了图像中的灰度分布规律。它描述每个灰度级具有的像素个数,但不包含
这些像素在图像中的位置信息。
图像直方图不关心像素所处的空间位置,因此不受图像旋转和平移变化的影响,可以作为图像的特征。

2.直方图的应用:

在这里插入图片描述
直方图的应用主要体现在来表现图像是否过亮或过暗,而解决的办法就是直方图均值化。

3.代码实现:

  1. 头文件:
import cv2
import numpy as np
from matplotlib import pyplot as plt
  1. 灰度图像直方图绘制:
    1. plt接口实现:
      # 获取灰度图像
      img = cv2.imread("lenna.png", 1)
      gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      #cv2.imshow("image_gray", gray)# 灰度图像的直方图,方法一
      plt.figure()
      plt.hist(gray.ravel(), 256)
      plt.show()
      
    2. opencv接口实现:
      '''
      equalizeHist—直方图均衡化
      函数原型: equalizeHist(src, dst=None)
      src:图像矩阵(单通道图像)
      dst:默认即可
      '''# 灰度图像的直方图, 方法二
      hist = cv2.calcHist([gray],[0],None,[256],[0,256])
      plt.figure()#新建一个图像
      plt.title("Grayscale Histogram")
      plt.xlabel("Bins")#X轴标签
      plt.ylabel("# of Pixels")#Y轴标签
      plt.plot(hist)
      plt.xlim([0,256])#设置x坐标轴范围
      plt.show()
      
  2. 彩色图像直方图绘制:
#彩色图像直方图image = cv2.imread("lenna.png")
cv2.imshow("Original",image)
#cv2.waitKey(0)chans = cv2.split(image)    #把图像维度切割
colors = ("b","g","r")
plt.figure()
plt.title("Flattened Color Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")for (chan,color) in zip(chans,colors):hist = cv2.calcHist([chan],[0],None,[256],[0,256])plt.plot(hist,color = color)plt.xlim([0,256])
plt.show()

4.实现结果:

在这里插入图片描述

二,直方图均衡化

1.直方图均衡化的概念:

直方图均衡化是将原图像的直方图通过变换函数变为均匀的直方图,然后按均匀直方图修改原
图像,从而获得一幅灰度分布均匀的新图像。
直方图均衡化就是用一定的算法使直方图大致平和的方法
直方图均衡化的作用是图像增强
注意:能适当提升图像的对比度
在这里插入图片描述

2.直方图均衡化的思想:

为了将原图像的亮度范围进行扩展,需要一个映射函数,将原图像的像素值均衡映射到新直
方图中,这个映射函数有两个条件:

  1. 为了不打乱原有的顺序,映射后亮、暗的大小关系不能改变,
  2. 映射后必须在原有的范围内,比如(0-255)

实现步骤:

  1. 依次扫描原始灰度图像的每一个像素,计算出图像的灰度直方图H
  2. 计算灰度直方图的累加直方图
  3. 根据累加直方图和直方图均衡化原理得到输入与输出之间的映射关系。
  4. 最后根据映射关系得到结果:dst(x,y) = H’(src(x,y))进行图像变换

映射关系的推导:(在实际应用中采用接口调用即可)

  1. 对于输入图像的任意一个像素p, p∈[0,255], 总能在输出图像里有对应的像素q, q∈[0,255] 使得下面等式成立(输入和输出的像素总量相等):
    在这里插入图片描述
  2. 其中,输出图像每个灰度级的个数:
    在这里插入图片描述
    H和W代表图像的长和宽,HW就是指图像中存在的像素点个数*
  3. 代入累加直方图公式:
    在这里插入图片描述
    (q+1)是指从0到q有q+1个值
    最后的结果就是红色框的公式!
    不过这里要注意:在运算后的q可能是负数,如果要手动实现该算法,这里要处理一下

3.直方图均衡化的实现举例:

首先要我们要明确:替换前和替换后的像素值的映射关系如下:
在这里插入图片描述
最开始,我们需要均衡化的图像中的像素值如下:
在这里插入图片描述
很明显看出来,这个图像是5*5的图像,像素值最高是9,最低是0。
接下来,我们建立一个表格:
在这里插入图片描述
pix值:是指图像中包含所有的像素值:该图像是从0-9。
Ni值:是该pix像素值存在的个数,在目标图像中,0像素有3个,Ni值就为3。
Pi值:是该像素值的概率。在这里插入图片描述
sunmPi值就是之前Pi的总和,也可以看作sumPi=Pi+sumP(i-1),比如sumP0=P0=0.12,sumP1=sumP0+P1
最后的结果就是sumPi×255-1,最后将这个结果四舍五入后的数值替换原像素数值。

4.代码实现:

  1. 头文件
import cv2
import numpy as np
from matplotlib import pyplot as plt
  1. 灰度图像直方图均衡化
'''
equalizeHist—直方图均衡化
函数原型: equalizeHist(src, dst=None)
src:图像矩阵(单通道图像)
dst:默认即可
'''# 获取灰度图像
img = cv2.imread("lenna.png", 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    #转换成灰色图像
#cv2.imshow("image_gray", gray)# 灰度图像直方图均衡化
dst = cv2.equalizeHist(gray)# 直方图
hist = cv2.calcHist([dst],[0],None,[256],[0,256])plt.figure()
plt.hist(dst.ravel(), 256)
plt.show()cv2.imshow("Histogram Equalization", np.hstack([gray, dst]))
cv2.waitKey(0)
  1. 彩色图像直方图均衡化
# 彩色图像直方图均衡化
img = cv2.imread("lenna.png", 1)
cv2.imshow("src", img)# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst_rgb", result)cv2.waitKey(0)

5.实现结果:

在这里插入图片描述
在这里插入图片描述
结果对比很明显发现在直方图中像素值变的均匀很多,而且明显均衡化的图像的对比度更高。

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

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

相关文章

时间序列因果关系_分析具有因果关系的时间序列干预:货币波动

时间序列因果关系When examining a time series, it is quite common to have an intervention influence that series at a particular point.在检查时间序列时,在特定时间点对该序列产生干预影响是很常见的。 Some examples of this could be:例如: …

微生物 研究_微生物监测如何工作,为何如此重要

微生物 研究Background背景 While a New York Subway station is bustling with swarms of businessmen, students, artists, and millions of other city-goers every day, its floors, railings, stairways, toilets, walls, kiosks, and benches are teeming with non-huma…

Linux shell 脚本SDK 打包实践, 收集assets和apk, 上传FTP

2019独角兽企业重金招聘Python工程师标准>>> git config user.name "jenkins" git config user.email "jenkinsgerrit.XXX.net" cp $JENKINS_HOME/maven.properties $WORKSPACE cp $JENKINS_HOME/maven.properties $WORKSPACE/app cp $JENKINS_…

opencv:卷积涉及的基础概念,Sobel边缘检测代码实现及卷积填充模式

具体参考我的另一篇文章: opencv:卷积涉及的基础概念,Sobel边缘检测代码实现及Same(相同)填充与Vaild(有效)填充 这里是对这一篇文章的补充! 卷积—三种填充模式 橙色部分为image, 蓝色部分为…

无法从套接字中获取更多数据_数据科学中应引起更多关注的一个组成部分

无法从套接字中获取更多数据介绍 (Introduction) Data science, machine learning, artificial intelligence, those terms are all over the news. They get everyone excited with the promises of automation, new savings or higher earnings, new features, markets or te…

web数据交互_通过体育运动使用定制的交互式Web应用程序数据科学探索任何数据...

web数据交互Most good data projects start with the analyst doing something to get a feel for the data that they are dealing with.大多数好的数据项目都是从分析师开始做一些事情,以便对他们正在处理的数据有所了解。 They might hack together a Jupyter n…

PCA(主成分分析)思想及实现

PCA的概念: PCA是用来实现特征提取的。 特征提取的主要目的是为了排除信息量小的特征,减少计算量等。 简单来说: 当数据含有多个特征的时候,选取主要的特征,排除次要特征或者不重要的特征。 比如说:我们要…

【安富莱二代示波器教程】第8章 示波器设计—测量功能

第8章 示波器设计—测量功能 二代示波器测量功能实现比较简单,使用2D函数绘制即可。不过也专门开辟一个章节,为大家做一个简单的说明,方便理解。 8.1 水平测量功能 8.2 垂直测量功能 8.3 总结 8.1 水平测量功能 水平测量方…

深度学习数据更换背景_开始学习数据科学的最佳方法是了解其背景

深度学习数据更换背景数据科学教育 (DATA SCIENCE EDUCATION) 目录 (Table of Contents) The Importance of Context Knowledge 情境知识的重要性 (Optional) Research Supporting Context-Based Learning (可选)研究支持基于上下文的学习 The Context of Data Science 数据科学…

熊猫数据集_用熊猫掌握数据聚合

熊猫数据集Data aggregation is the process of gathering data and expressing it in a summary form. This typically corresponds to summary statistics for numerical and categorical variables in a data set. In this post we will discuss how to aggregate data usin…

IOS CALayer的属性和使用

一、CALayer的常用属性 1、propertyCGPoint position; 图层中心点的位置,类似与UIView的center;用来设置CALayer在父层中的位置;以父层的左上角为原点(0,0); 2、 property CGPoint anchorPoint…

QZEZ第一届“饭吉圆”杯程序设计竞赛

终于到了饭吉圆杯的开赛,这是EZ我参与的历史上第一场ACM赛制的题目然而没有罚时 不过题目很好,举办地也很成功,为法老点赞!!! 这次和翰爷,吴骏达 dalao,陈乐扬dalao组的队&#xff0…

谈谈数据分析 caoz_让我们谈谈开放数据…

谈谈数据分析 caozAccording to the International Open Data Charter(1), it defines open data as those digital data that are made available with the technical and legal characteristics necessary so that they can be freely used, reused and redistributed by any…

数据创造价值_展示数据并创造价值

数据创造价值To create the maximum value, urgency, and leverage in a data partnership, you must present the data available for sale or partnership in a clear and comprehensive way. Partnerships are based upon the concept that you are offering value for valu…

卷积神经网络——各种网络的简洁介绍和实现

各种网络模型:来源《动手学深度学习》 一,卷积神经网络(LeNet) LeNet分为卷积层块和全连接层块两个部分。下面我们分别介绍这两个模块。 卷积层块里的基本单位是卷积层后接最大池化层:卷积层用来识别图像里的空间模…

数据中台是下一代大数据_全栈数据科学:下一代数据科学家群体

数据中台是下一代大数据重点 (Top highlight)Data science has been an eye-catching field for many years now to young individuals having formal education with a bachelors, masters or Ph.D. in computer science, statistics, business analytics, engineering manage…

pwn学习之四

本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波。 bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete会清0变量导致无法写,一直没构造出unsorted bin attack,后面根…

北方工业大学gpa计算_北方大学联盟仓库的探索性分析

北方工业大学gpa计算This is my firts publication here and i will start simple.这是我的第一篇出版物,这里我将简单介绍 。 I want to make an exploratory data analysis of UFRN’s warehouse and answer some questions about the data using Python and Pow…

泰坦尼克数据集预测分析_探索性数据分析-泰坦尼克号数据集案例研究(第二部分)

泰坦尼克数据集预测分析Data is simply useless until you don’t know what it’s trying to tell you.除非您不知道数据在试图告诉您什么,否则数据将毫无用处。 With this quote we’ll continue on our quest to find the hidden secrets of the Titanic. ‘The …

关于我

我是谁? Who am I?这是个哲学问题。。 简单来说,我是Light,一个靠前端吃饭,又不想单单靠前端吃饭的Coder。 用以下几点稍微给自己打下标签: 工作了两三年,对,我是16年毕业的90后一直…