今天帶來的內容只用兩個字形容-乾貨!!首先我們科普下圖像識別的常識,圖片在電腦看來,其實就是一個矩陣,每個矩陣中的一個值都對應圖片的一個像素點。(下圖摘自《機器學習實踐應用》)
圖片中其實是有很多的邊以及拐角的,今天要介紹的就是如何通過算法找到圖片拐角。
原理
其實找到拐角,很簡單,就是在圖片矩陣中,通過一個移動的窗口去遍歷矩陣中的數值,一旦返現有像素變化明顯的地方,那就可能是一個拐點。這個過程就有點像“拿澡巾閉著眼睛從上向下搓澡,當你搓到一個硬硬的東西的時候,你會感覺這個部位跟其它的地方不同,沒錯,這裡就是你的膝蓋。”
還是正經一點,看一下數學公式,(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給大家看看,身邊沒有拐角特別明顯的東西,隨手弄了張感覺比較明顯的拐角圖,恩!
原圖:
運行結果:
今天代碼寫的我快缺氧了,歡迎猛烈轉載,良心製作,謝謝!
閱讀更多 比特到商業智能 的文章