图像处理笔记2-直方图与直方图均衡化histogram equalization
1.直方图
1.1.什么是直方图(灰度直方图,单通道)
- 图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。
- 图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数
- 其中,横坐标是灰度级,纵坐标是该灰度级出现的频率(也可以是该灰度级出现的测试)
1.2 直方图性质
- 直方图反映了图像中的灰度分布规律。它描述每个灰度级具有的像素个数,但不包含这些像素在图像中的位置信息。
- 任何一幅特定的图像都有唯一的直方图与之对应,但不同的图像可以有相同的直方图。
- 如果一幅图像有两个不相连的区域组成,并且每个区域的直方图已知,则整幅图像的直方图是该两个区域的直方图之和
- 且具有图像平移、旋转、缩放不变性等众多优点(无论怎么变,图还是这张图)
1.3.直方图案例
1.4.绘制直方图
OpenCV中内置的函数----calcHist:
calcHist—计算图像直方图
函数原型:calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)- images:图像矩阵,例如:[image]
- channels:通道数,例如:0
- mask:掩膜,一般为:None
- histSize:直方图大小,一般等于灰度级数
- ranges:横轴范围
方法1:直接绘制lena
灰度直方图看看,如下:
import cv2
from matplotlib import pyplot as plt# 灰度图像直方图
img = cv2.imread("lenna.png", 1) # 读取彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 彩色转为灰度图
cv2.imshow("image_gray", gray) # 展示出来看看# 灰度图像的直方图,方法一
plt.figure()
# numpy中的ravel(), 将多维数组转换为一维数组
plt.hist(gray.ravel(), 256) # 绘制直方图
plt.show()
弹出图片如下:
方法2:采用
OpenCV
库calcHist
,绘制灰度直方图看看
import cv2
from matplotlib import pyplot as plt# 灰度图像直方图
img = cv2.imread("lenna.png", 1) # 读取彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 彩色转为灰度图
cv2.imshow("image_gray", gray) # 展示出来看看# 灰度图像的直方图, 方法二
hist = cv2.calcHist([gray], [0], None, [256], [0,256])
plt.figure() #新建一个图像
plt.xlabel("Bins") #X轴标签
plt.ylabel("# of Pixels") #Y轴标签
plt.plot(hist)
plt.xlim([0, 256]) #设置x坐标轴范围
plt.title('method 2 calcHist')
plt.show()
弹出图片如下:
绘制彩色直方图(3通道形式,1通道的3次操作)
import cv2
from matplotlib import pyplot as plt#彩色图像直方图
image = cv2.imread("lenna.png", 1)
cv2.imshow("Original", image)chans = cv2.split(image) # 分离通道
colors = ("b", "g", "r")
plt.figure()
plt.title('lenna split calcHist')
plt.xlabel("Bins")
plt.ylabel("Pixels Num")for (chan, color) in zip(chans, colors):hist = cv2.calcHist([chan], [0], None, [256], [0,256])print(color)plt.plot(hist, color=color)plt.xlim([0, 256])
plt.show()
结果展示:
2.直方图均衡化
2.1.直方图均衡化概念和目的
为了将原图像的亮度范围进行扩展,需要一个映射函数,将原图像的像素值均衡映射到新直方图中。
这个映射函数有两个条件:
- 为了不打乱原有的顺序,映射后亮、暗的大小关系不能改变(亮暗的差距可能大了)
- 映射后必须在原有的范围内,比如(0-255)
2.2.均衡化步骤:
- 依次扫描原始灰度图像的每一个像素,计算出图像的灰度直方图H
- 计算灰度直方图的累加直方图
- 根据累加直方图和直方图均衡化原理得到输入与输出之间的映射关系。
- 最后根据映射关系得到结果:dst(x,y) = H’(src(x,y))进行图像变换
如下:
映射计算举例:由0-9的像素范围,映射到0-255
其中:
- pix是像素值
- Ni是对应pix像素的个数
- Pi是对应pix像素个数在整幅图的占比
- sumPi是对应pix向上的累加,比如pix=1的sumPi=0.12+0.08=0.2
这样,以0-255为尺度,原来0-9的尺度范围,就被均衡的拉到了0-255
2.3.OpenCV直方图均衡化
OpenCV中直方图均衡化的内置函数是equalizeHist,用法如下:
equalizeHist—直方图均衡化
函数原型: equalizeHist(src, dst=None)- src:图像矩阵(单通道图像)
- dst:默认即可
2.3.1.灰度直方图均衡化
那直接对lena灰度图进行直方图均衡化增强,代码如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt# 获取灰度图像
img = cv2.imread("lenna.png", 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 灰度图像直方图均衡化
dst = cv2.equalizeHist(gray)# 直方图
gray_hist = cv2.calcHist([gray], [0], None, [256], [0,256])
dst_hist = cv2.calcHist([dst], [0], None, [256], [0,256])# 绘图展示
plt.figure(figsize=(12,12),dpi=100)
plt.subplot(2,2,1)
plt.plot(gray_hist)
plt.xlabel("Bins")
plt.ylabel("Pixels Num")
plt.title("gray_hist")plt.subplot(2,2,2)
plt.plot(dst_hist)
plt.xlabel("Bins")
plt.ylabel("Pixels Num")
plt.title("dst_hist")plt.subplot(2,2,3)
plt.imshow(gray, cmap='gray')
plt.title("gray_image")plt.subplot(2,2,4)
plt.imshow(dst, cmap='gray')
plt.title("dst_image")plt.show()
展示结果:
可以明显的看到:
- 增强后的直方图分布的范围更加的广了
- 增强后的图像,对比度更强了,尤其是帽子部分
2.3.2.彩色直方图均衡化
彩色直方图均衡化可以类比到我们前面绘制彩色的直方图一样,对通道进行拆分,分别进行直方图均衡化增强,然后再合并。代码如下:
# 彩色图像直方图均衡化
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)
结果展示:
注意事项
- 直方图是一种图像像素分布的统计方式,跟图像是一一对应的,一个图像对应唯一的直方图
- 直方图均衡化是对原始图像的一种像素操作(图像处理)方式,能够增强图像对比度
- 图像增强方法有很多种,直方图均衡化是方法之一
欢迎访问:图像处理笔记合集
图像处理笔记2-直方图与直方图均衡化histogram equalization相关推荐
- Python+OpenCV:直方图均衡化(Histogram Equalization)
Python+OpenCV:直方图均衡化(Histogram Equalization) ####################################################### ...
- java 灰度直方图_【数字图像处理】灰度直方图、直方图均衡化、直方图规定化...
灰度直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少. 图像的灰度直方图是灰 ...
- python图像直方图与直方图均衡化
图像直方图以及灰度与彩色图像的直方图均衡化 图像直方图: 图像的直方图用来表征该图像像素值的分布情况.用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目 ...
- DIP数字图像处理笔记
数字图像处理--南信大 范春年老师 期末复习笔记 matlab语法 期中考试总结 邻域 图像增强 概念 直方图的图像增强 点处理 直方图均衡化histogram equalization 意义 效果 ...
- 数字图像处理100问—23 直方图均衡化( Histogram Equalization )
提示:内容整理自:https://github.com/gzr2017/ImageProcessing100Wen CV小白从0开始学数字图像处理 23 直方图均衡化( Histogram Equal ...
- 【图像处理】图像强度变换、直方图均衡化(Image Intensity Transformations and Histogram Equalization)
实验要求 该实验使用强度变换方法对图像进行增强.实验图像为图3.8(a) (1.a) 用公式(3.2-2)所示的对数变换方法进行图像增强. (1.b) 用公式(3.2-3)形式的指数变换方 ...
- opencv进阶学习笔记7:直方图,直方图均衡化,直方图比较,直方图反向投影
基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 直方图基础讲解: opencv学 ...
- 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波8 - 直方图处理 - 直方图均衡化(全局直方图均衡化)
直方图均衡化 灰度映射函数: s=T(r),0≤r≤L−1(3.8)s = T(r), \quad 0\leq r \leq L -1 \tag{3.8}s=T(r),0≤r≤L−1(3.8) 假设: ...
- 数字图像处理:局部直方图处理(Local Histogram Processing)
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在前面章节<<数字图像处理>直方图均衡学习总结+感悟> ...
- python绘制灰度图片直方图-python数字图像处理(9):直方图与均衡化
在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...
最新文章
- 如何调用系统的包安装自己的apk呢?
- python3精要(28)-filter
- [课程设计]Scrum 2.5 多鱼点餐系统开发进度(下单一览页面-菜式添加框架设计)
- centos 安装及vim使用
- 83)PHP,配置文件功能
- HDU5926 Mr. Frog’s Game
- Tensorflow学习笔记 (用 tf.data 加载图片)
- 【毫米波雷达】人体目标探测理论
- ZedGraph的一些属性
- JavaScript 弹出框(警告框、确认框、提示框)
- 【Go学习】GO语言异常处理机制panic和recover分析
- c语言32关键字详解pdf,C语言32个关键字.pdf
- 大家的人工智能——学习路线总览
- [矩阵求逆+二分图匹配]BZOJ 3168 [Heoi2013]钙铁锌硒维生素
- 在CAD中加载大影像的一种方法
- Python 根据身份证号计算生日,年龄和性别
- 谷歌浏览器——新建下载任务
- 计算机组成原理之基本组成
- Python渗透测试工具库
- Waymo获得加州首个完全自动驾驶汽车许可证
热门文章
- html书签展示(带搜索)
- 创业者必备知识SWOT分析模型+案例分析
- linux英英词典项目,[开发手记] 一款基于命令行的英英词典 (A CLI-Based EE Dictionary)...
- PDF文档如何解密?3个软件值得收藏
- eclipse给jar包打断点
- 使用Setup Factory安装包制作工具制作安装包
- 2020年全球激光雷达行业竞争格局分析,技术路线正处于快速发展迭代阶段「图」
- 推荐5款纯净好用的良心浏览器,实现浏览自由
- python打开360浏览器_Selenium安装与360浏览器使用
- DEDECMS短信宝短信插件