今天带来的内容只用两个字形容-干货!!首先我们科普下图像识别的常识,图片在电脑看来,其实就是一个矩阵,每个矩阵中的一个值都对应图片的一个像素点。(下图摘自《机器学习实践应用》)
图片中其实是有很多的边以及拐角的,今天要介绍的就是如何通过算法找到图片拐角。
原理
其实找到拐角,很简单,就是在图片矩阵中,通过一个移动的窗口去遍历矩阵中的数值,一旦返现有像素变化明显的地方,那就可能是一个拐点。这个过程就有点像“拿澡巾闭着眼睛从上向下搓澡,当你搓到一个硬硬的东西的时候,你会感觉这个部位跟其它的地方不同,没错,这里就是你的膝盖。”
还是正经一点,看一下数学公式,(x,y)可以理解成是一张图片的横纵坐标,就是人的身体。(u,v)就是窗口函数,就是移动的澡巾。找图片的拐点就跟搓澡去找身体坚硬的地方一样,需要不断游动(u,v)的值,当这个值剧烈变化了,就说明出现了拐点。
最终通过数学方法,可以简化上边的函数式,过程很复杂,大家会意下就好,最终的结果:
R是这样判断的,R=MIN(x',y'),x'表示图片横向的变化趋势,y‘表示图片纵向的变化趋势,这个可以用一张图解释下,
(1)下图左数第一张是y’向变化很小,而x‘向变化大,可以设定为x'>0,y'
(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给大家看看,身边没有拐角特别明显的东西,随手弄了张感觉比较明显的拐角图,恩!
原图:
运行结果:
今天代码写的我快缺氧了,欢迎猛烈转载,良心制作,谢谢!
参考:
领取专属 10元无门槛券
私享最新 技术干货