使用Python+OpenCV进行图像处理(三)

磐创AI
关注

角点检测(Corner Detection)

角点检测是另一种广泛应用于目标检测、运动检测、视频目标追踪等领域的检测算法。图像处理中的角是什么?应该如何定义?在这里,我们把角看作是边相交的连接点。那我们怎么才能找到他们呢? 你可能会想到一个最基础的方式是先找到所有的边,然后找到它们相交的点。但实际上,还有另一种更高效的方法确认角点提高效率的方法,即Harris角点检测和Shi&Tomasi角点检测。接下来让我们来详细了解这两种算法。

这两种算法的工作原理如下。首先,检测出各个方向上像素强度值有很大变化的点。然后构造一个矩阵,从中提取特征值。通过这些特征值进行评分从而决定它是否是一个角。数学表达式如下所示。

现在让我们看看它们的代码实现。首先,需要把图片转换为灰度图。Harris角点检测可以通过OpenCV中的cv2.cornerHarris()函数实现。

img = cv2.imread('images/desk.jpg')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

# Apply Harris corner detection

dst = cv2.cornerHarris(img_gray, blockSize = 2, ksize = 3, k = .04)

参数blocksize是指定领域窗口设定的大小,k是Harris检测的自由参数对应上方公式中的k值。输出结构为得分R,我们将使用R得分检测角点。

# Spot the detected corners

img_2 = img.copy()

img_2[dst>0.01*dst.max()]=[255,0,0]

# Plot the image

plt.figure(figsize = (20, 20))

plt.subplot(1, 2, 1); plt.imshow(img)

plt.axis('off')

plt.subplot(1, 2, 2); plt.imshow(img_2)

plt.axis('off')

下方是Shi-Tomasi角点检测的代码实现。使用函数cv2.goodFeaturesToTrack()实现。通过maxCorners参数指定最大角点个数。相应地,通过minDistance指定角点间的最小距离和角点评定的最小质量级别。得到检测到的角点后,使用圆圈标记这些角点,如下所示:

# Apply Shi-Tomasi corner detection

corners = cv2.goodFeaturesToTrack(img_gray, maxCorners = 50,
                                 qualityLevel = 0.01,
                                 minDistance = 10)

corners = np.int0(corners)

# Spot the detected corners

img_2 = img.copy(

for i in corners:

   x,y = i.ravel()

cv2.circle(img_2, center = (x, y), 

radius = 5, color = 255, thickness = -1)

# Plot the image

plt.figure(figsize = (20, 20))

plt.subplot(1, 2, 1); plt.imshow(img)

plt.axis('off')

plt.subplot(1, 2, 2); plt.imshow(img_2)

plt.axis('off')

001 (9)人脸检测

人脸检测是一种识别图像中是否存在人脸以及人脸的位置的技术。人脸检测不同于人脸识别,人脸识别是通过一个人的脸来识别这个人。 所以人脸检测并不能告诉我们这个人脸是属于谁。

人脸检测本质上是一项分类任务,训练其分类物体是否存在来从而实现检测。基于Haar特征的级联分类器是OpenCV中常用的人脸检测模型之一。它已经在数千副图像上进行过预训练。理解该算法的四个关键点分别是:Haar特征提取、积分图像、Adaboost和级联分类器。

类haar特征(Haar-like features)是用于目标检测的数字图像特征,示例如上图。Haar特征这个名字来源于其与Harr小波的直观相似性,且Haar小波最初是由Alfred Haar提出的。在检测过程中,通过滑动窗口和滤波器上的卷积操作来确认这些特征是不是我们所需要的特征。如下方所示:

那么,我们具体如何来确定给定区域是否含有需要的特征呢? 如上方图片中所示。使用一个特定卷积核(上半区域是暗的,下半区域是亮的)得到每个区域像素值的平均值,并减去两者之间的差距。如果结果高于阈值(比如0.5),则可得出结果,其就是我们正在检测的特征。对每个内核重复这个过程,同时在图像上滑动窗口。

虽然这个计算过程并不复杂,但如果在正个图像重复这个过程计算量还是很大的。这也是积分图像要解决的主要问题。积分图像是一种图像表示方式,它是为了提高特征估计的速度与效率而衍生出来的。

如下图所示,左边是原始图像的像素值,右边是积分图像的像素值。从左上角开始计算给定矩形区域下像素的累加值。在积分图像上,将虚线框像素值的累加和填充在右边框的右下角处。

使用上方这个“预计算表”,我们可以通过子矩形(上图中红色、橙色、蓝色和紫色框)的值方便地得到某个区域的像素值总和。

所以积分图像可以帮助我们在一定程度上解决计算量过大的问题。但还不够,还存在着计算量优化的空间。当检测窗口位于没有目标或人脸的空白背景时,执行检测则会耗费不必要的计算量。这时就可以通过使用Adaboost和级联分类器,从而实现计算量进一步优化。

上图展示了级联分类器逐步构造的各个阶段,并对类haar特征进行排序。基本特征会在早期阶段被识别出来,后期只识别有希望成为目标特征的复杂特征。在每一个阶段,Adaboost模型都将由集成弱分类器进行训练。如果子部件或子窗口在前一阶段被分类为“不像人脸的区域”,则将被拒绝进入下一步。通过上述操作,只须考虑上一阶段筛选出来的特征,从而实现更高的速度。

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存