第五章常用函数
计算直方图
hist = cv2.calcHist(image,channel,mask,histSize,range, accumulate)
·hist表示返回的统计直方图,数组内的元素是各个灰度级的像素个数。
·image表示原始图像,该图像需要用“[]”括起来。
·channel表示指定通道编号。通道编号需要用“[]”括起来。
·mask表示掩模图像。当统计整幅图像的直方图时,将这个值设为None。当统计图像某一部分的直方图时,需要用到掩模图像。
·histSize表示BINS的值,该值需要用“[]”括起来。
·range表示像素值范围。
·accumulate表示累计标识,默认值为False。
如果被设置为True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。该参数是可选的,一般情况下不需要设置。
# 或者
matplotlib.pyplot中的hist()
OpenCV
计算直方图
使用示例
import cv2 as cv
image = cv.imread("F:/picture/panda.jpg")
# 导入一幅图像
hist = cv.calcHist([image],[0],None, [256], [0,255])
# 计算其统计直方图信息
print(hist) # 输出统计直方图信息,为一维数组
plot()
函数绘制直方图
使用- 使用
plot()
绘制曲线
import matplotlib.pyplot as plt #导入绘图模块
# 构建两个列表
arr1 = [1,1.2,1.5,1.6,2,2.5,2.8,3.5,4.3]
arr2 = [5,4.5,4.3,4.2,3.6,3.4,3.1,2.5,2.1,1.5]
plt.plot(arr1) # 绘制arr1的图像
plt.plot(arr2,'r') # 绘制arr2的图像,'r'表示用红色绘制
plt.show()
- 使用
plot()
函数将calcHist()
的返回值绘制出来
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread("F:/picture/panda.png")
# 导入一幅图像
hist = cv.calcHist([image],[0],None, [256], [0,255])
# 得到统计直方图的信息
plt.plot(hist) # 显示直方图
plt.show()
hist()
函数直接绘制图像直方图
使用matplotlib.pyplot.hist(image,BINS)
·BINS表示灰度级的分组情况。
·image表示原始图像数据,必须将其转换为 一维数据 。*******************
import cv2 as cv
import matplotlib.pyplot as plt # 导入绘图模块
image = cv.imread("F:/picture/panda.png") # 读取一幅图像
image = image.ravel() # 将图像转换为一维数组
plt.hist(image,256) # 绘制直方图
直方图正规化
正规化代码实现
image = cv.imread("F:/picture/img4.jpg",0) # 读取一幅灰度图像
imageMax = np.max(image) # 计算image的最大值
imageMin = np.min(image) # 计算image的最小值
min_l = 0 max_l = 255
m = float(max_l-min_l)/(imageMax-imageMin)# 计算m、n的值
n = min_l -min_l*m
image1 = m*image + n # 矩阵的线性变换
image1 = image1.astype(np.uint8) # 数据类型转换
cv.imshow("image",image)
plt.figure("原始直方图")
plt.hist(image.ravel(),256)
plt.figure("正规化后直方图")
plt.hist(image1.ravel(),256)
plt.show()
# 显示原始图像
cv.imshow("image",image)
plt.figure("原始直方图")
plt.hist(image.ravel(),256)
# 显示正规化后的图像
plt.figure("正规化后直方图")
plt.hist(image1.ravel(),256)
plt.show()
cv.waitKey()
cv.destroyAllWindows()
normalize
实现
使用cv2.normalize()
函数来实现图像直方图正规化- 一般令
norm_type=NORM_MINMAX
,其计算原理与前面提到的计算方法基本相同。 cv2.normalize(src,dst,alpha,beta,norm_type,dtype)
cv.imshow("image",image)
# 显示原始图像的直方图
plt.figure("原始直方图")
# 画出图像直方图
plt.hist(image.ravel(),256)
# 直方图正规化
image1 = cv.normalize(image,image,255, 0, cv.NORM_MINMAX, cv.CV_8U)
# 显示正规化后的图像
plt.figure("正规化后直方图")
# 画出图像直方图
plt.hist(image.ravel(),256)
plt.hist(image.ravel(),256)
plt.show()
直方图均衡化
cv2.equalHist()
函数,用于实现图像的直方图均衡化:dst = cv2. equalHist (src)
import numpy as np
import cv2 as cv
import math
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
# 计算图像灰度直方图
def calcGrayHist(image):
# 灰度图像矩阵的宽高
rows, cols = image.shape
# 存储灰度直方图
grayHist = np.zeros([256], np.uint32)
for r in range(rows):
for c in range(cols):
grayHist[image[r][c]] += 1
return grayHist
def equalHist(image):
# 灰度图像矩阵的宽高
rows, cols = image.shape
# 计算灰度直方图
grayHist = calcGrayHist(image)
# 计算累加灰度直方图
zeroCumuMoment = np.zeros([256], np.uint32)
for p in range(256):
if p == 0:
zeroCumuMoment[p] = grayHist[0]
else:
zeroCumuMoment[p] = zeroCumuMoment[p - 1] + grayHist[p]
# 根据直方图均衡化得到的输入灰度级和输出灰度级的映射
outPut_q = np.zeros([256], np.uint8)
cofficient = 256.0 / (rows * cols)
for p in range(256):
q = cofficient * float(zeroCumuMoment[p]) - 1
if q >= 0:
outPut_q[p] = math.floor(q) #小于q的最大整数
else:
outPut_q[p] = 0
# 得到直方图均衡化后的图像
equalHistImage = np.zeros(image.shape, np.uint8)
for r in range(rows):
for c in range(cols):
equalHistImage[r][c] = outPut_q[image[r][c]]
return equalHistImage
# 主函数
image = cv.imread("F:/picture/cartree.jpg",cv.IMREAD_ANYCOLOR)
dst = equalHist(image) # 直方图均衡化
# 显示图像
cv.imshow("image", image) # 显示原图像
cv.imshow("dst",dst) # 显示均衡化图像
# 显示原始图像直方图
plt.figure("原始直方图")
plt.hist(image.ravel(),256) # ravel()多维数组转换为一维数组的功能
# 显示均衡化后的图像直方图
plt.figure("均衡化直方图")
plt.hist(dst.ravel(),256)
plt.show()
cv.waitKey()
cv.destroyAllWindows()
cv2.equalHist()
实现直方图均衡化
使用import cv2 as cv
import matplotlib.pyplot as plt
# 读取一幅图像
image = cv.imread("F:/picture/cartree.jpg", cv.IMREAD_GRAYSCALE)
cv.imshow("cartree", image) # 显示原始图像
equ = cv.equalizeHist(image) # 直方图均衡化处理
cv.imshow("equcartree", equ) # 显示均衡化后的图像
plt.figure("原始直方图") # 显示原始图像直方图
plt.hist(image.ravel(),256)
plt.figure("均衡化直方图") # 显示均衡化后的图像直方图
plt.hist(equ.ravel(),256)
plt.show()
cv.waitKey()
cv.destroyAllWindows()
自适应直方图均衡化
cv.createCLAHE()
函数实现限制对比度的直方图均衡化
使用import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
image = cv.imread("F:/picture/img4.jpg",cv.IMREAD_GRAYSCALE)
# 创建CLAHE对象
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
# 限制对比度的自适应阈值均衡化
dst = clahe.apply(image)
# 显示图像
cv.imshow("image", image)
cv.imshow("clahe",dst)
plt.figure("原始直方图") # 显示原始图像直方图
plt.hist(image.ravel(),256)
plt.figure("均衡化直方图") # 显示均衡化后的图像直方图
plt.hist(dst.ravel(),256)
plt.show()
实验内容
实验一 图像预处理
得到单帧图片的方法
使用帧间差分法获取视频的关键帧,帧间差分法是一种通过对 视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法。
- 加载视频并计算每帧之间差异
- 使用差分阈值,大于平均帧间差的帧被认为时关键帧
- 去掉开始的5帧和最后的5帧
去背景的方法
使用肤色侦测法中的 YCrCb
空间的肤色提取来去除背景
- 将
RGB
图像转换到YCrCb
空间,提取Cr
分量图像 - 对Cr分量进行高斯滤波
- 对Cr分量做二值化阈值分割处理
OSTU
法
找到手的位置并切割
使用Haar
分类器的方法,剔除图像中的面部
- 一个子窗口在图片窗口中不断的位移滑动
- 子窗口每到一个位置,计算出该区域的特征
- 使用训练好的级联分类器对该特征进行筛选,判断该区域是否为面部
切割的方法
- 对图像二值化处理
- 找到图像的边界
- 剔除过大过小无效的
box
实验二 图像训练集的构建
- 将所有的图片重命名
- 将图片压缩为64*64的
- 为了获取更多的数据集,对图片进行旋转操作
- 将所有的图片制作成
h5
文件作为训练集
实验三 图像识别模型的搭建
CNN
卷积神经网络的原理