1 传统算法目标检测

区域选择 --> 特征提取 --> 特征分类

1.1 区域选择 python 实现 图像滑动窗口

区域选取:首先选取图像中可能出现物体的位置,由于物体位置、大小都不固定,因此传统算法通常使用滑动窗口(Sliding Windows)算法,但这种算法会存在大量的冗余框,并且计算复杂度高。
滑动窗口: 固定一个窗口,截取图片

1.1.1 以滑动窗口方式切分图像

import cv2
def sliding_window(src_img,step,windowsize):'''src_img : 源图像out_img : 输出图像step : 步进步长 元组类型windowsize :窗口大小 元组类型'''cnt = 0 # 记录滑动窗口数目for y in range(0,src_img.shape[0],step[1]):for x in range(0,src_img.shape[1],step[0]):image_patch = src_img[y:y+windowsize[0],x:x+windowsize[1]]cnt += 1cv2.imwrite("image/sliding_img/"+str(cnt)+".png",image_patch)if __name__ == "__main__":img = cv2.imread("image/src_img/1.jpg")step = (50,50)windowsize = (100,100)sliding_window(img,step,windowsize)

1.1.2 滑动窗口简单动画演示

import cv2
import numpy as np
import matplotlib.pyplot as plt
def sliding_window(path,step,windowsize):'''src_img : 源图像out_img : 输出图像step : 步进步长 元组类型windowsize :窗口大小 元组类型'''# cv2.fillConvexPoly()函数可以用来填充凸多边形,只需要提供凸多边形的顶点即可.src_img = cv2.imread(path)for y in range(0,src_img.shape[0],step[1]):for x in range(0,src_img.shape[1],step[0]):# 先计算坐标x_min = xy_min = yx_max = x + windowsize[1]y_max = y + windowsize[0]src_img1 = cv2.imread(path)src_img2 = cv2.cvtColor(src_img1,cv2.COLOR_BGR2RGB)rectangle = np.array([[x_min,y_min],[x_min,y_max],[x_max,y_max],[x_max,y_min]])# cv2.fillConvexPoly 单个多边形填充cv2.fillConvexPoly(src_img2,rectangle,(0,0,0)) # (0,0,0) 颜色填充plt.imshow(src_img2)plt.show()plt.pause(0.1)plt.clf()if __name__ == "__main__":plt.ion() # 使得plt.show()显示后不暂停,交互模式,可以使用plt.ioff()停止path = "image/src_img/1.jpg"step = (50,50)windowsize = (200,200)sliding_window(path,step,windowsize)

1.2 特征提取

特征提取:在得到物体位置后,通常使用人工精心设计的提取器进行特征提取,如SIFT和HOG等。由于提取器包含的参数较少,并且人工设计的鲁棒性较低,因此特征提取的质量并不高。

1.2.1 python提取图像SIFT特征

SIFT(Scale-invariant feature transform),也叫尺度不变特征变换算法,是David Lowe于1999年提出的局部特征描述子(Descriptor),并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。Mikolajczyk对包括Sift算子在内的十种局部描述子所做的不变性对比实验中,Sift及其扩展算法已被证实在同类描述子中具有最强的健壮性。

其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。局部影像特征的描述与侦测可以帮助辨识物体,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。

python-opencv提取SIFT特征为以下步骤:

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('image/src_img/1.jpg')
cv2.imshow("original",img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d.SIFT_create() # 创建sift对象
keypoints, descriptor  = sift.detectAndCompute(gray, None) # 检测单通道图像特征点# 绘制特征点
cv2.drawKeypoints(image = img,outImage = img,keypoints = keypoints,flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,color = (51,163,236))
cv2.imshow("SIFT",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

为了体现SIFT特征的作用,我将图片加入旋转,看是否能实现图像匹配。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image/src_img/1.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 为了能够在任意位置进行旋转变换,OpenCV提供了一个函数:cv2.getRotationMarix2D( ),这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例:
rows, cols = img.shape[:2]M1 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 0.5)
# cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))
# 参数说明: img表示输入的图片,rot_mat表示仿射变化矩阵,(image.shape[1], image.shape[0])表示变换后的图片大小
img1 = cv2.warpAffine(img, M1, (cols, rows))gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
gray1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)sift = cv2.ORB_create() # 创建sift对象
keypoints, descriptor  = sift.detectAndCompute(gray, None) # 检测单通道图像特征点和描述符
keypoints1, descriptor1  = sift.detectAndCompute(gray1, None) # 检测单通道图像特征点和描述符# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
mathces = bf.match(descriptor,descriptor1) #匹配描述子
mathces=sorted(mathces,key=lambda x:x.distance) #据距离来排序
# 绘制特征点
img2 = cv2.drawMatches(img1=img,keypoints1=keypoints,img2=img1,keypoints2=keypoints1,matches1to2=mathces[:10],outImg = None) #画出匹配关系plt.imshow(img2)
plt.show()


从结果可以看出,SIFT特征能有效应对几何变换,能够很好实现图像匹配。

1.2.2 python提取图像HOG特征

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

HOG特征提取步骤:

1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;

3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。

4)将图像划分成小cells(例如6*6像素/cell);

5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;

6)将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。

7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

python-opencv 提取HOG特征

HOG特征介绍参考视频
HOG特征介绍参考资料,这篇文章对过程讲得很清楚,重点看

通过opencv中的cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,Bin)可以方便直接地获得HOG特征描述算子。

cv2.HOGDescriptor用法介绍

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image/src_img/1.jpg')
# 创建HOG对象,参数使用默认参数
hog = cv2.HOGDescriptor()
winStride = (8, 8)
padding = (8, 8)
hog_feature = hog.compute(img,winStride,padding) # 一定要有后面两个参数
print(hog_feature.shape) # 张量
print(hog_feature.reshape((-1,))) # 转变为向量
print(hog_feature.reshape((-1,)).shape)

为了更好展示HOG特征可视化结果,这里采用了scikit-image包展示,参考链接

使用scikit-image之前,需要pip install scikit-image 进行安装

pip install scikit-image

可视化代码如下:

import matplotlib.pyplot as plt
import cv2
from skimage.feature import hog
from skimage import exposureimage = cv2.imread('image/src_img/1.jpg')
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)fd, hog_image = hog(image, orientations=8, pixels_per_cell=(16, 16),cells_per_block=(1, 1), visualize=True)fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True)ax1.axis('off')
ax1.imshow(image, cmap=plt.cm.gray)
ax1.set_title('Input image')# Rescale histogram for better display
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 10))
ax2.axis('off')
ax2.imshow(hog_image_rescaled, cmap=plt.cm.gray)
ax2.set_title('Histogram of Oriented Gradients')
plt.savefig("HOG_image.png")
plt.show()

可视化结果如下:

传统目标检测方法研究(一)相关推荐

  1. 目标检测:传统目标检测方法

    文章目录 引言 什么是传统目标检测? 区域选择 特征提取 分类器 传统目标检测方法不足 引言 提到Computer Vision,可能我们会最先想到CV的基本任务Image Classificatio ...

  2. 目标检测YOLO实战应用案例100讲-基于深度学习的自动驾驶车辆三维目标检测方法研究与应用

    目录 基于深度学习的车辆目标检测方法研究 基于卷积神经网络的目标检测技术

  3. 目标检测 Chapter1 传统目标检测方法

    文章目录 目标检测问题定义 介绍 目标检测和图像分类.图像分割的区别 目标检测问题方法 传统目标检测 深度学习目标检测 传统 Vs 深度学习 传统目标检测综述 Viola-Jones HOG+SVM ...

  4. 目标检测YOLO实战应用案例100讲-无监督领域自适应目标检测方法研究与应用

    目录 无监督领域自适应目标检测方法研究 领域自适应目标检测 目标检测相关技术介绍

  5. 目标检测YOLO实战应用案例100讲-基于多尺度特征融合的水下小目标检测方法研究

    目录 水下弱小目标检测算法研究 水下目标检测相关研究基础 2.1水下目标检测算法概述

  6. 目标检测YOLO实战应用案例100讲-复杂背景下的红外弱小目标检测方法研究

    目录 复杂背景下的弱小红外目标检测 基于单帧和基于多帧检测方法的比较 ​编辑

  7. 基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测,目标追踪,卷积神经网络

    一.研究意义 卷积神经网络(CNN)由于其强大的特征提取能力,近年来被广泛用于计算机视觉领域.1998年Yann LeCun等提出的LeNet-5网络结构,该结构使得卷积神经网络可以端到端的训练,并应 ...

  8. 目标检测YOLO实战应用案例100讲-自动驾驶场景下的三维目标检测技术研究

    目录 辅助驾驶场景下的目标检测算法研究 传统目标检测方法 基于深度学习的目标检测方法

  9. 深度学习目标检测方法汇总

    目标检测简介   目标检测是计算机视觉的一个重要研究方向,是指从一个场景(或图片)中找到感兴趣的目标.任务大致分为三个流程: 从场景中提取候选区 从候选区提取特征 识别候选区的类别并对有效的候选框进行 ...

  10. 如何使用CNN进行物体识别和分类_基于CNN目标检测方法(RCNN系列,YOLO,SSD)

    转载自:基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测 一.研究意义 卷积神经网络(CNN)由于其强大的特征提取能力,近年 ...

最新文章

  1. java 读取数据库结构_JAVA从SQLITE数据库中读取省份地市构造一棵树
  2. Anaconda中文版
  3. 【PAT乙级题库】全套总结
  4. C++——《算法分析》实验贰——最长公共子序列问题
  5. Django组件-用户认证
  6. 实验吧web-易-what a fuck!这是什么鬼东西?
  7. 一个最简单的SPRINGMVC示例
  8. MYSQL的简单命令
  9. C语言蒙特卡洛,蒙特卡洛(Monte Carlo)模拟法 一  ( EXCEL 举例)
  10. 推动Web开放生态持续发展 百度正式发布Lavas解决方案
  11. vue学习之ElementUI时间选择器报错getTime is not a function
  12. 邮箱发送附件,附件变成了bin文件
  13. App Extension
  14. matlab 元编程,北航有限元编程大作业(Matlab)
  15. 蓝牙耳机哪款好?2021无线蓝牙耳机测评
  16. 16路彩灯控制器 FPGA-Verilog
  17. linux安装Oracle 11g详解
  18. 【嵌入式】旋转编码器原理
  19. 计算机学数学物理方法,计算机在数学物理方法习题课中的应用
  20. 电脑 默认网关不可用,时不时断网,解决办法

热门文章

  1. 世界顶级企业的数据中台打造之旅
  2. 【高德地图API】Web地图开发系列(一)
  3. xshell命令:cd进入指定(目标路径)文件夹 - 解说篇
  4. P1_C1-3:系统分析与设计概要
  5. 【软件project】 文档 - 银行业务管理 - 需求分析
  6. Vue消息列表已读/未读状态实时更新及数据更新set()用法
  7. 激活win10专业版最简单的方法
  8. 思科模拟器中配置单区域OSPF
  9. 加入域 提示 无法加载指定的脱机注册表配置单元
  10. 【实例演示】ESP8266+U8g2库,玩转OLED显示