图像拐点检测-原理以及代码实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gshengod/article/details/79995699


今天带来的内容只用两个字形容-干货!!首先我们科普下图像识别的常识,图片在电脑看来,其实就是一个矩阵,每个矩阵中的一个值都对应图片的一个像素点。(下图摘自《机器学习实践应用》)


图片中其实是有很多的边以及拐角的,今天要介绍的就是如何通过算法找到图片拐角。  



原理

其实找到拐角,很简单,就是在图片矩阵中,通过一个移动的窗口去遍历矩阵中的数值,一旦返现有像素变化明显的地方,那就可能是一个拐点。这个过程就有点像“拿澡巾闭着眼睛从上向下搓澡,当你搓到一个硬硬的东西的时候,你会感觉这个部位跟其它的地方不同,没错,这里就是你的膝盖。” 


还是正经一点,看一下数学公式,(x,y)可以理解成是一张图片的横纵坐标,就是人的身体。(u,v)就是窗口函数,就是移动的澡巾。找图片的拐点就跟搓澡去找身体坚硬的地方一样,需要不断游动(u,v)的值,当这个值剧烈变化了,就说明出现了拐点。



最终通过数学方法,可以简化上边的函数式,过程很复杂,大家会意下就好,最终的结果:


R是这样判断的,R=MIN(x',y'),x'表示图片横向的变化趋势,y‘表示图片纵向的变化趋势,这个可以用一张图解释下,

(1)下图左数第一张是y’向变化很小,而x‘向变化大,可以设定为x'>0,y'<0,于是R<0。

(2)中间的一张两个方向都不变,R=0

(3)最右边一张两个方向变化都很大,x'>0,y'>0,R>0


于是,最右边的图是拐角,最左边的是边,中间的什么都不是。


代码

下面就用一段OPENCV的代码实现一下拐点检测,可以通过红点把拐角的地方标出来,给大家一个直观印象。


import numpy as np  

import cv2  

from matplotlib import pyplot as plt  

img = cv2.imread('sample.jpg')  

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  

corners = cv2.goodFeaturesToTrack(gray,25,0.01,10)  

corners = np.int0(corners)  

for i in corners:  

    x,y = i.ravel()  

    cv2.circle(img,(x,y),3,255,-1)  

plt.imshow(img),plt.show()


再跑一个case给大家看看,身边没有拐角特别明显的东西,随手弄了张感觉比较明显的拐角图,恩!

原图:



运行结果:



今天代码写的我快缺氧了,欢迎猛烈转载,良心制作,谢谢!

参考:

https://blog.csdn.net/woxincd/article/details/60754658

https://blog.csdn.net/qq_41352018/article/details/79944481

猜你喜欢

转载自blog.csdn.net/gshengod/article/details/79995699