aLIEz1 / chapter5

数字图像处理第五章

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

第五章常用函数

计算直方图

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() 

image.png

  • 使用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() 

image.png

使用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.png

直方图正规化

正规化代码实现

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() 

image.png

使用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()

image.png

直方图均衡化

  • 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()

image.png

使用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()

image.png

实验内容

实验一 图像预处理

得到单帧图片的方法

使用帧间差分法获取视频的关键帧,帧间差分法是一种通过对 视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法。

  1. 加载视频并计算每帧之间差异
  2. 使用差分阈值,大于平均帧间差的帧被认为时关键帧
  3. 去掉开始的5帧和最后的5帧

去背景的方法

使用肤色侦测法中的 YCrCb 空间的肤色提取来去除背景

  1. RGB图像转换到YCrCb空间,提取Cr分量图像
  2. 对Cr分量进行高斯滤波
  3. 对Cr分量做二值化阈值分割处理OSTU

找到手的位置并切割

使用Haar分类器的方法,剔除图像中的面部

  1. 一个子窗口在图片窗口中不断的位移滑动
  2. 子窗口每到一个位置,计算出该区域的特征
  3. 使用训练好的级联分类器对该特征进行筛选,判断该区域是否为面部

切割的方法

  1. 对图像二值化处理
  2. 找到图像的边界
  3. 剔除过大过小无效的box

实验二 图像训练集的构建

  1. 将所有的图片重命名
  2. 将图片压缩为64*64的
  3. 为了获取更多的数据集,对图片进行旋转操作
  4. 将所有的图片制作成h5文件作为训练集

实验三 图像识别模型的搭建

CNN卷积神经网络的原理

实验四 图像识别系统的开发

About

数字图像处理第五章


Languages

Language:Python 100.0%