圖像拐點檢測-原理以及代碼實現

今天帶來的內容只用兩個字形容-乾貨!!首先我們科普下圖像識別的常識,圖片在電腦看來,其實就是一個矩陣,每個矩陣中的一個值都對應圖片的一個像素點。(下圖摘自《機器學習實踐應用》)

圖像拐點檢測-原理以及代碼實現

圖片中其實是有很多的邊以及拐角的,今天要介紹的就是如何通過算法找到圖片拐角。

圖像拐點檢測-原理以及代碼實現

原理

其實找到拐角,很簡單,就是在圖片矩陣中,通過一個移動的窗口去遍歷矩陣中的數值,一旦返現有像素變化明顯的地方,那就可能是一個拐點。這個過程就有點像“拿澡巾閉著眼睛從上向下搓澡,當你搓到一個硬硬的東西的時候,你會感覺這個部位跟其它的地方不同,沒錯,這裡就是你的膝蓋。”

還是正經一點,看一下數學公式,(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給大家看看,身邊沒有拐角特別明顯的東西,隨手弄了張感覺比較明顯的拐角圖,恩!

原圖:


圖像拐點檢測-原理以及代碼實現

運行結果:

圖像拐點檢測-原理以及代碼實現


今天代碼寫的我快缺氧了,歡迎猛烈轉載,良心製作,謝謝!


分享到:


相關文章: