1 图像直方图
1.1 直方图定义
- 定义:横坐标:图像中各个像素点的灰度级 ;纵坐标:就有该灰度级的像素个数
- 归一化直方图:横坐标:图像中各个像素点的灰度级 ;纵坐标:出现这个灰度的概率
2 pyplot绘制直方图
- pyplot提供了类似matlab的绘图框架 ,import matplolib.pyplot as plt,函数hist(数据源,像素级)
- 功能:根据数据源以及像素级绘制直方图 数据源:图像,必须是一维数组 函数ravel b=a.ravel()
- 功能:将多维数组降为一维数组
- 格式:一维数组=多维数组.revel() 像素级:一般是256,指[0, 255]
3 opencv绘制直方图
- 统计直方图函数 calcHisthist = cv2.calcHist(images, channels, mask,histSize, ranges,accumulate)
- 参数
Images:原始图像
Channels:指定通道,通道编号需要用中括号括起来,输入图像是灰度图时,它的值为[0];彩色图像可以使[0],[1],[2]分别对应通道B,G,R。
•mask:掩码图像,统计整幅图像的直方图,设为None;统计图像某一部分的直方图时,需要掩码图像 - 生成掩码图像的操作
mask = np.zeros(image.shape, np.uint8)
mask[200:400, 200:400] = 255
- histSize:BINS的数量
- ranges:像素值返回RANGE;像素值范围,例如:[0, 255]
- Accumulate:累计标识;默认值为false;如果被设置为true,则直方图在开始分配时不会被清零,该参数允许从多个对象中计算单个直方图,或者用户实施更新直方图;多个直方图的累计结果,用户对一组图像计算直方图
- 返回值 Hist:直方图,使用pyplot绘制
- 生成掩膜图像
例如:mask = np.zero(800, np.uint8)
mask[300:500, 300:500] = 255
masked_img = cv2.bitwise_and(img, mask)
4 直方图均衡化
- 理论基础
前提: 如果一幅图像占有全部可能的灰度级,并且均匀分布。
结论: 该图像具有高对比度和多变的灰度色调
外观: 图像细节丰富,质量更高 - 算法
计算累计直方图
将累计直方图进行区间转换
在累计直方图中,概率相近的原始值,会被处理为相同的值 - 应用场合
医疗图像处理;车牌识别;人脸识别 - 均衡化函数equalizeHist dst = cv2.equalizeHist(src) (灰度图)
参数 src : 源图像
返回值 dst : 目标图像,处理结果 - 分栏函数subplot subplot(nrows, ncols, plot_number) 参数 nrows : 行号 ncols :
列号 plot_number : 窗口序号
•示例: subplot(2, 3, 4)
•特例: 当每一个参数都小于10时,可以直接书写三个数字,表示为subplot(234)
4 实例
#!/usr/bin/env python
# encoding: utf-8
# @Time : 2020/8/8 11:18
# @Author : yq
# @Site :
# @File : tutorial_7.py.py
# @Software: PyCharm
import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
# 使用plt绘制直方图
def hist_demo(image):
plt.hist(image.ravel(),255)
plt.show()
# 彩色图像直方图
def calcHist_color_demo(image):
histb = cv.calcHist([image], [0], None, [256], [0, 255])
histg = cv.calcHist([image], [1], None, [256], [0, 255])
histr = cv.calcHist([image], [2], None, [256], [0, 255])
plt.plot(histb, color = "b")
plt.plot(histg, color = "g")
plt.plot(histr, color = "r")
plt.show()
# 灰色图像直方图
def calcHist_gray_demo(image):
histb = cv.calcHist([image], [0], None, [256], [0, 255])
plt.plot(histb, color="b")
plt.show()
# 绘制掩码直方图
def caicHist_mask_demo(image):
# 显示灰度图
image = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
plt.subplot(221)
plt.imshow(image,plt.cm.gray)
# 显示掩码
mask = np.zeros(image.shape, np.uint8)
mask[20:40, 20:40] = 255
plt.subplot(222)
plt.imshow(mask,plt.cm.gray)
# 掩码绘制直方图
histMI = cv.calcHist([image], [0], mask, [256], [0, 255])
plt.subplot(223)
plt.plot(histMI, color="b")
# 全部图像绘制直方图
histImage = cv.calcHist([image], [0], None, [256], [0, 255])
plt.subplot(224)
plt.plot(histImage, color="r")
plt.show()
# 均衡化直方图(对比)
def equ_demo(img):
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
equ = cv.equalizeHist(img)
plt.subplot(2,2,1)
plt.imshow(img, plt.cm.gray)
plt.axis('off')
#
plt.subplot(222)
plt.hist(img.ravel(), 256)
plt.subplot(223)
plt.imshow(equ, plt.cm.gray)
plt.axis('off')
plt.subplot(224)
plt.hist(equ.ravel(), 256)
plt.show()
src = cv.imread("C:/Users/Administrator/Pictures/tt.png")
# cv.imshow("inputWindows", src)
caicHist_mask_demo(src)
cv.waitKey(0)
cv.destroyAllWindows();