目标检测(Object Detection)原理与实现(一)

基于阈值图像处理的目标检测    

      从今天起开始要写一些关于目标检测的文章,涵盖从简单的阈值图像处理检测、霍夫变换(hough transform)检测、模版匹配检测(刚体匹配)、AAM+ASM+ACM(非刚体)匹配检测到近代机器学习方法检测,尽量贴一些代码,这些很实用。本篇就从阈值图像处理检测开始。阈值顾名思义就是一个分界值,做图像处理的都明白阈值的用途,但是考虑到各种观众,干脆把OpenCV中的各种阈值标识符和对应代码示意都贴出来,如(图一)所示:


(图一)

       仔细阅读下(图一)中的各种伪代码,就很容易明白阈值函数的工作机制,其中src(x,y)是图像像素点值。下面就给出一个处理答题卡的例子,(图二)是从网上找到的一个答题卡样图,我们的目标是检测到哪些选项被涂黑了,然后根据坐标判定是哪个数字,其实根据坐标是有依据的,因为答题卡四个角有一些对准线,对齐后用扫描仪扫描后紧跟着经过算法处理就可以判断出考生选项,本篇文章就简化流程,考虑到涂的选项是黑色的,因此我们使用第二个阈值方法,经过处理后如(图三)所示。

    

(图二)                                         (图三)

几乎perfect,嘿嘿大笑,下面把代码也贴出来,python版本的。

 

import numpy as np
import cv2
img=cv2.imread('anwser_sheet.jpg')
grey=cv2.cvtColor(img,cv2.cv.CV_BGR2GRAY)
retval,grey=cv2.threshold(grey,90,255,cv2.cv.CV_THRESH_BINARY_INV)
 
grey=cv2.erode(grey,None)
grey=cv2.dilate(grey,None)
 
contours,hierarchy=cv2.findContours(grey.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
newimg=np.zeros_like(grey) 
cv2.drawContours(newimg, contours, -1, 255)
cv2.imshow('test',newimg)
cv2.imwrite("processed.jpg",newimg)
cv2.waitKey()
代码流程先是读取图像文件,接着转成灰度图,接着做个开运算(腐蚀后再膨胀),接着阈值处理,最后把目标轮廓画出,根据目标块的坐标可以大概的推算出对应的数字,接着秀一下打印出某个涂项,比如最后一个,那么只需要把

cv2.drawContours(newimg, contours, -1, 255) 改成 cv2.drawContours(newimg, contours, 0, 255)

第三个参数为负数表示打印所有轮廓,0表示打印最后一个选项,打印是倒着数的。如(图四)所示:


(图四)

      基于阈值图像处理的目标检测一般只适应于自己能控制颜色和亮度的项目中,这也为什么规定答题卡要尽量使用黑色的(同一颜色方便阈值处理),另外这种方法也可以用在目标的三维重建上,如(图五)所示,用阈值的方法找到汽车上的标定点对后续点云的获取很有帮助,进而完成整个汽车模型的三位重建,此方法虽然简单,但对这几种场景很实用,通过简单的图像处理(各个阶段去噪)后,然后简单的查找下各种闭合小轮廓就OK了,好了,今天就说到这,比较简单,后续会越来越复杂些,用到的数学知识也越来越多。


(图五)

转载请注明出处:http://blog.csdn.net/cuoqu/article/details/9058735

没有更多推荐了,返回首页