[Python与图像处理]Python构建积分图像并提取Haar特征

#本文利用Python提取图像的Haar特征,旨在了解Haar特征的原理。

关于Haar特征的介绍可以参考:https://zhuanlan.zhihu.com/p/31427728

Haar特征的几种常见类型:

Python代码实现:

#coding:utf-8
#*********************************************************************************************************
'''
说明:利用python/numpy/opencv提取图像Haar特征
算法思路:
        1)以灰度图的方式加载图片,并计算可获取的Haar特征尺度数;
        2)计算对应的积分图像,以便于Haar特征的快速计算;
		3)利用积分图像计算图像X2类型的不同尺度Haar特征;
		4)获得的feature这个特征可用于Adaboost级联检测。
具体参数:输入图像大小(640,480),积分图像大小(641,481),
          初始尺度Haar_block_size = (24, 24), 宽和高同等放大,可获取20个尺度Haar特征,
          对于初始尺度:Haar特征图的大小(640-24+1, 480-24+1)= (617,457),该尺度Haar特征维度:281969
          总的Haar特征维度为:2164660
'''
import cv2
import numpy as np
import matplotlib.pyplot as plt

#获取积分图像
def integral( img ):
    #积分图像比原始图像多一行一列,积分图像第一行第一列为0
    integimg = np.zeros( shape = (img.shape[0] + 1, img.shape[1] + 1), dtype = np.int32 )
    for i in range( 1, img.shape[0] ):
        for j in range( 1, img.shape[1] ):
            integimg[i][j] = img[i][j] + integimg[i-1][j] + integimg[i][j-1] - integimg[i-1][j-1]
    # plt.imshow( integimg )
    # plt.show()
    print( '    Done!' )
    return integimg

#获取单一尺度的Haar特征
def haar_onescale( img, integimg, haarblock_width, haarblock_height  ):
    #步长为1, no padding
    haarimg = np.zeros( shape = ( img.shape[0] - haarblock_width + 1, img.shape[1] - haarblock_height + 1 ), dtype = np.int32 )
    # plt.imshow( haarimg )
    # plt.show()
    haar_feature_onescale = []
    for i in range( haarimg.shape[0] ):
        for j in range( haarimg.shape[1] ):
            #i,j映射回原图形的坐标
            m = haarblock_width + i
            n = haarblock_height + i
            haar_all = integimg[m][n] - integimg[m-haarblock_width][n] - integimg[m][n-haarblock_height] + integimg[m-haarblock_width][n-haarblock_height]
            haar_black = integimg[m][n- int( haarblock_height/2 )] - integimg[m-haarblock_width][n-int( haarblock_height/2 )]- integimg[m][n-haarblock_height] + integimg[m-haarblock_width][n-haarblock_height]
            #1*all - 2*black = white - black
            haarimg[i][j] = 1 * haar_all - 2 * haar_black
            haar_feature_onescale.append( haarimg[i][j] )
    # plt.imshow( haarimg )
    # plt.show()
    print( '        当前尺度下的Haar特征维度为: {}'.format( len( haar_feature_onescale ) ) )
    
    return haar_feature_onescale

#获取全尺度下的Haar特征
def harr( haarblock_width, haarblock_height, Scale_num ):
    feature = []
    haar_num = 0
    for i in range( Scale_num):
        haarblock_width = i*haarblock_width + 24
        haarblock_height = i*haarblock_height + 24
        print( '    当前 Haarblock 尺度为: ( {}, {} )'.format( haarblock_height, haarblock_width ) ) 
        haar_feature_onescale = haar_onescale( img, integimg, haarblock_width, haarblock_height )
        haar_num += len( haar_feature_onescale ) 
        feature.append( haar_feature_onescale )
        haarblock_width = 24
        haarblock_height = 24
    #计算总的Haar特征维度
    print( '[INFO] 计算Haar特征维数' )
    print( '    Haar特征总的维度为: {}'.format( haar_num ) )
    return feature
    
if __name__ == '__main__':
    #以灰度图的方式读取图像
    img = cv2.imread( 'data/basketball1.png', cv2.IMREAD_GRAYSCALE )
    if ( img is None ):
        print( 'Not read img.' )
    #确定Haarblock的大小
    haarblock_width = 24
    haarblock_height = 24
    width_limt = int( img.shape[0] / haarblock_width )
    height_limt = int( img.shape[1] / haarblock_height )
    print( '--行方向尺度个数为: {}, 列方向尺度个数为: {}'.format( width_limt, height_limt ) )
    #可获取的尺度数量
    Scale_num = min( height_limt, width_limt )
    print( '--可用尺度个数为: {}'.format( Scale_num ) )
    #获取积分图像
    print( '[INFO] 计算积分图像' )
    integimg = integral( img )

    print( '[INFO] 提取图像Haar特征' )
    haar_feature = harr( haarblock_width, haarblock_height, Scale_num  )
    
       

最终输出为:

--行方向尺度个数为: 20, 列方向尺度个数为: 26
--可用尺度个数为: 20
[INFO] 计算积分图像
    Done!
[INFO] 提取图像Haar特征
    当前 Haarblock 尺度为: ( 24, 24 )
        当前尺度下的Haar特征维度为: 281969
    当前 Haarblock 尺度为: ( 48, 48 )
        当前尺度下的Haar特征维度为: 256769
    当前 Haarblock 尺度为: ( 72, 72 )
        当前尺度下的Haar特征维度为: 232721
    当前 Haarblock 尺度为: ( 96, 96 )
        当前尺度下的Haar特征维度为: 209825
    当前 Haarblock 尺度为: ( 120, 120 )
        当前尺度下的Haar特征维度为: 188081
    当前 Haarblock 尺度为: ( 144, 144 )
        当前尺度下的Haar特征维度为: 167489
    当前 Haarblock 尺度为: ( 168, 168 )
        当前尺度下的Haar特征维度为: 148049
    当前 Haarblock 尺度为: ( 192, 192 )
        当前尺度下的Haar特征维度为: 129761
    当前 Haarblock 尺度为: ( 216, 216 )
        当前尺度下的Haar特征维度为: 112625
    当前 Haarblock 尺度为: ( 240, 240 )
        当前尺度下的Haar特征维度为: 96641
    当前 Haarblock 尺度为: ( 264, 264 )
        当前尺度下的Haar特征维度为: 81809
    当前 Haarblock 尺度为: ( 288, 288 )
        当前尺度下的Haar特征维度为: 68129
    当前 Haarblock 尺度为: ( 312, 312 )
        当前尺度下的Haar特征维度为: 55601
    当前 Haarblock 尺度为: ( 336, 336 )
        当前尺度下的Haar特征维度为: 44225
    当前 Haarblock 尺度为: ( 360, 360 )
        当前尺度下的Haar特征维度为: 34001
    当前 Haarblock 尺度为: ( 384, 384 )
        当前尺度下的Haar特征维度为: 24929
    当前 Haarblock 尺度为: ( 408, 408 )
        当前尺度下的Haar特征维度为: 17009
    当前 Haarblock 尺度为: ( 432, 432 )
        当前尺度下的Haar特征维度为: 10241
    当前 Haarblock 尺度为: ( 456, 456 )
        当前尺度下的Haar特征维度为: 4625
    当前 Haarblock 尺度为: ( 480, 480 )
        当前尺度下的Haar特征维度为: 161
[INFO] 计算Haar特征维数
    Haar特征总的维度为: 2164660
  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用 Python 实现图像识别,你可以使用以下几个步骤: 1. 安装 Python 和必要的库 要进行图像识别,你需要安装 Python 和一些必要的库。其中最重要的是 OpenCV 和 TensorFlow。你可以使用 pip 包管理器来安装这些库: ``` pip install opencv-python tensorflow ``` 2. 加载图像 要在 Python 中进行图像识别,你需要将图像加载到你的程序中。你可以使用 OpenCV 的 `imread()` 函数来加载图像。例如,如果你有一张名为 `image.jpg` 的图像,你可以使用以下代码将其加载到 Python 中: ``` python import cv2 image = cv2.imread('image.jpg') ``` 3. 预处理图像 在进行图像识别之前,你需要对图像进行一些预处理。这包括调整图像的大小、色彩空间和对比度等。你可以使用 OpenCV 中的一些函数来完成这些操作。例如,以下代码将图像大小调整为 224 x 224 像素,并将其转换为灰度图像: ``` python image = cv2.resize(image, (224, 224)) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 4. 加载模型 要进行图像识别,你需要加载一个预先训练好的模型。你可以使用 TensorFlow 来加载模型。以下代码将加载一个名为 `model.h5` 的模型: ``` python import tensorflow as tf model = tf.keras.models.load_model('model.h5') ``` 5. 进行预测 最后,你可以使用加载的模型来进行图像识别。以下代码将对预处理后的图像进行预测: ``` python import numpy as np # 将图像转换为 4D 张量 image = np.expand_dims(gray, axis=2) image = np.expand_dims(image, axis=0) # 进行预测 prediction = model.predict(image) # 显示预测结果 print(prediction) ``` 在这个示例中,`prediction` 变量将包含一个包含预测结果的 NumPy 数组。你可以使用这些结果来确定图像中显示的对象是什么。 以上就是使用 Python 实现图像识别的基本步骤。当然,这只是一个简单的示例。在实际应用中,你需要考虑许多其他因素,例如如何处理图像中的噪声,如何处理图像中的多个对象等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值