图像直方图,直方图均衡化和掩膜
目录
一.图像直方图
1.图像直方图的概念与作用
2. 绘制直方图的方法
二.图像直方图均衡化
1.图像直方图均衡化介绍和全局均衡化
2.自适应直方图均衡化(局部直方图均衡化)
三.掩膜
1.掩膜(Mask)技术详解
2.掩膜的生成与应用
3.像素直方图的计算
一.图像直方图
1.图像直方图的概念与作用
- 定义: 图像直方图是用于统计和图形化表示图像中像素值分布情况的一种工具。它会统计出在整个图片中,各个像素强度(灰度值)的出现频率。
- 作用: 在实际应用中,可用于检测场景变化。例如,在白天,图像的直方图峰会偏向较高像素值;切换至夜间后,对应的峰值会向较低像素值移动。
2. 绘制直方图的方法
- 方法一 (NumPy高级):
- 从OpenCV读取图像矩阵。
- 使用numpy.ravel()方法将二维像素阵拉伸成一维数组。
- 利用matplotlib.pyplot.hist()函数进行直方图绘制和显示。
import cv2
from matplotlib import pyplot as plt
image=cv2.imread('coca.png',cv2.IMREAD_GRAYSCALE)
a=image.ravel()
#绘制直方图
plt.hist(a,bins=256)#bins=256指定直方图的条数,即灰度级的数量
plt.show()
- 方法二 (OpenCV原生):
- 使用cv2.calcHist()方法直接计算直方图。
- 主要参数包括:
- 输入的图片矩阵。
- 统计的通道数,灰度图传“0”,彩色图需循环指定B、G、R三个通道。
- bins(区间数),即直方图的分割条数。
- 像素值的计算范围。
- 计算出的直方图结果需使用matplotlib进行绘制和展示。
image_hist=cv2.calcHist([image],[0],None,[16],[0,256])
#第一个参数 [image]输入图像的列表(必须用中括号包裹)
plt.plot(image_hist)#使用calcHist的值绘制曲线图
plt.show()
绘制彩色图的直方图
img=cv2.imread('img.png')
color=('b','g','r')
for i,col in enumerate(color):hister=cv2.calcHist([img],[i],None,[256],[0,256])plt.plot(hister,color=col)
plt.show()
二.图像直方图均衡化
1.图像直方图均衡化介绍和全局均衡化
是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。
实现方法:通过将图像的像素值分布均匀化来实现这一目标。
在Python OpenCV中,可以使用cv2.equalizeHist()函数来实现直方图全局均衡化。
- 原理:将图像像素的灰度分布拉伸,使其在整个灰度范围内均匀分布,从而增强图像的对比度和细节。
- 效果:在处理暗部图像时,能使原本暗淡的部分变得更亮、更具细节,如下面的的“black.jpg”图片在均衡化后变得清晰可见。
均衡前后图片对比:
woman=cv2.imread('black.jpg',cv2.IMREAD_GRAYSCALE)
woman = cv2.resize(woman,(300,400))
plt.hist(woman.ravel(),bins=256)
plt.show()
woman_equalize=cv2.equalizeHist(woman)
plt.hist(woman_equalize.ravel(),bins=256)
plt.show()
res=np.hstack((woman,woman_equalize))
cv2.imshow('res',res)
cv2.waitKey(0)
均衡化前直方图
均衡化后直方图
2.自适应直方图均衡化(局部直方图均衡化)
- 原理:与全局均衡化不同,它将图像划分为多个小区域(如 16x16),然后对每个区域独立地进行直方图均衡化。
- 目的:避免全局处理可能造成的图像局部过曝或细节丢失,使调整更加平滑自然。
#自适应直方图均衡化(局部直方图均衡化)
clahe=cv2.createCLAHE(clipLimit=8,tileGridSize=(16,16))#clipLimit颜色对比阈值,tileGridSize局部直方图均衡化的模板大小
woman_clahe=clahe.apply(woman)
res=np.hstack((woman,woman_equalize,woman_clahe))
cv2.imshow('women_equalize',res)
cv2.waitKey(0)
clipLimit颜色对比阈值,tileGridSize局部直方图均衡化的模板大小
从左到右依次是原图,全局均衡化和自适应均衡化
三.掩膜
1.掩膜(Mask)技术详解
- 概念与原理: 掩膜是一种在图像处理中使用黑白二值图来限定处理区域的技术。“洞”的白色部分代表需要保留和处理的区域,“洞外”的黑色部分则不受影响或被忽略。
- 应用场景: 主要用于抽取图像内的特定目标(如人像、物体),实现“抠图”效果;也可用于对图像的局部进行特殊运算或统计分析。
2.掩膜的生成与应用
- 简单矩形掩膜的生成:
- 步骤一:创建一个与原始图片尺寸相同的全零(纯黑)NumPy数组作为基础。
- 步骤二:利用数组切片,指定起止行列坐标,将所需区域的像素值修改为255(纯白)。
mask=np.zeros(img.shape[:2],np.uint8)
mask[50:350,100:470]=255
cv2.imshow('mask',mask)
cv2.waitKey(0)
- 掩膜的应用:
- 在图像处理函数(如矩阵乘法、像素直方图计算等)中引入掩膜参数。
- 函数会自动识别掩膜中标示为“白”的区域,并仅对该区域内的像素值进行运算或统计,从而实现对图片局部范围的操作。
img_mask=cv2.bitwise_and(img,img,mask=mask)#对图像每个像素值进行二进制‘与’操作
cv2.imshow('img_mask',img_mask)
cv2.waitKey(0)
3.像素直方图的计算
- 当前状态:用于分析整幅图像的像素值分布。
- 明确需求:需要支持按掩膜区域进行统计,以获取特定目标区域的像素分布情况,对比整体分布会有显著差异,例如目标区域可能出现特定的灰度峰值。
img_hist_mask=cv2.calcHist([img],[0],mask,[256],[0,256])
plt.plot(img_hist_mask)
plt.show()