摘要:角檢測還可以用在運動檢測物體識別等方面。角檢測角檢測也叫角檢測是目前可用的最簡單的角檢測算法。為使得計算更方便,角測量給出了去除系數(shù)的方法,只要計算或為一個很小的正的常量,我們暫且稱此為方法。你還可以查看我的其它筆記參考資料
角檢測(Corner detection)是指檢測圖像中具有代表性的(我們感興趣的)角點,一般講為形狀或邊緣的拐角處,這些點可以大略標記對象在圖像中的輪廓和位置,如果從一個圖像序列中檢測每個圖像的角點,就可以找出圖像之間存在的相關和相對應的角點,這對比如全景拼接(多張圖片拼接成一張全景圖片)很有用。
角檢測還可以用在運動檢測、物體識別等方面。
Harris角檢測(也叫Harris & Stephens角檢測)是目前可用的最簡單的角檢測算法。它的基本思路是這樣的:對于圖像中的一個點,如果它周圍存在1個以上不同方向的邊緣,這個點所在處就是角。
下面需要粗略地介紹一下其中的數(shù)學原理,以便理解Harris濾波器函數(shù)參數(shù)的作用。
我們之前學習邊緣檢測的時候知道,邊緣上的點,水平和垂直兩個方向的梯度幅度(一階導數(shù))較周圍高,如果要檢測點所在處是否具有1個方向以上的邊緣,就必須要綜合它周圍點的梯度一起考慮,那么問題就變成了需要計算周圍區(qū)域,像素兩兩之間的梯度關系,我們在學習PCA算法的時候知道協(xié)方差矩陣能體現(xiàn)這種關系,設Ix為點x在它周圍一小塊區(qū)域內(nèi)的水平方向梯度,同樣,設Iy為點y垂直方向梯度,組成一個協(xié)方差矩陣:
在點(x,y)附近一小塊區(qū)域內(nèi),離(x,y)越近,關系越大,這就需要考慮加權計算,設加權算子為W(典型值使用高斯核,之前筆記介紹過),得到:
A = W * M
A被稱為Harris矩陣,它兩個特征值λ1和λ2,如果:
λ1和λ2都為較大的正數(shù),表示對應的(x,y)點處是角
若λ1較大,而且λ2約等于0,表示所在點只有一條邊,非角
若λ1和λ2都約等于0,表示所在處沒有邊角
求Harris矩陣的特征值計算量較大,Harris給出了一個方程:
上式只要計算矩陣的行列式(det)和跡(trace)即可,計算方便,得到的結果可作為角的檢測,其中系數(shù)k是一個經(jīng)驗值,它的設置跟邊緣的粗細有關。我們暫且把這種方法稱為k方法。
為使得計算更方便,Noble角測量(Noble’s corner measure)給出了去除k系數(shù)的方法,只要計算:
eps(或?)為一個很小的正的常量,我們暫且稱此為eps方法。
Harris代碼實現(xiàn)
根據(jù)以上所介紹的eps方法,下面實現(xiàn)一個Harris角檢測函數(shù):
def harris_eps(im, sigma=3): imx = np.zeros(im.shape) filters.gaussian_filter(im, (sigma,sigma), (0,1), imx) imy = np.zeros(im.shape) filters.gaussian_filter(im, (sigma,sigma), (1,0), imy) #計算兩兩之間的一階導數(shù) Wxx = filters.gaussian_filter(imx*imx,sigma) Wxy = filters.gaussian_filter(imx*imy,sigma) Wyy = filters.gaussian_filter(imy*imy,sigma) #計算行列式 Wdet = Wxx*Wyy - Wxy**2 #計算矩陣的跡 Wtr = Wxx + Wyy #按eps公式計算 return Wdet * 2 / (Wtr + 1e-06)
注意:書上并沒有嚴格按照公式計算返回值,經(jīng)測試,對某些圖片會出現(xiàn)無法除的情況,所以上面的代碼進行了改正
確定坐標
Harris返回的結果是一個與原圖像大小相同的矩陣,要判斷是否是角點,還需要做如下的工作:
設定一個閾值,只考慮高于閾值的點,這樣可以過濾掉無用的或不感興趣的點
一個角處一般會有多個點,在標記角坐標的時候,應該設定一個最小距離,在此距離內(nèi)只需要一個點進行標記即可
這個判斷函數(shù)可以使用skimage庫中的corner_peaks函數(shù),其中參數(shù)min_distance指上述的最小距離,threshold_rel則為閾值,函數(shù)原型:
skimage.feature.corner_peaks(harrisim, min_distance=10, threshold_abs=0, threshold_rel=0.1, ...)
函數(shù)默認返回由所有角點在原圖像中的坐標組成的數(shù)組。
skimage庫的Harris函數(shù)skimage庫也提供了Harris角檢測函數(shù):
skimage.feature.corner_harris(image, method="k", k=0.05, eps=1e-06, sigma=1) method: "k"或"eps",對應上述的兩種計算方法 k: k方法中的k系數(shù),取值區(qū)間為[0, 0.2],k的值越小,表示將檢測越銳利的角 eps: eps方法中的系數(shù),默認即可 sigma: 高斯核的標準差
簡單示例:
import numpy as np from skimage.feature import corner_harris, corner_peaks square = np.zeros([10, 10]) square[2:8, 2:8] = 1 square.astype(int) print square >>[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 1. 1. 1. 1. 1. 1. 0. 0.] [ 0. 0. 1. 1. 1. 1. 1. 1. 0. 0.] [ 0. 0. 1. 1. 1. 1. 1. 1. 0. 0.] [ 0. 0. 1. 1. 1. 1. 1. 1. 0. 0.] [ 0. 0. 1. 1. 1. 1. 1. 1. 0. 0.] [ 0. 0. 1. 1. 1. 1. 1. 1. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] harris_result = corner_harris(square) print corner_peaks(harris_result, min_distance=1) #此函數(shù)能夠從harris結果中檢測角的坐標位置 >>[[2 2] [2 7] [7 2] [7 7]]
上面harris_result如圖,觀察一下角處的值與周圍的不同:
我分別用我們自己實現(xiàn)的harris_eps函數(shù),跟skimage中的corner_harris函數(shù)進行效果對比,發(fā)現(xiàn)兩者存在差異,有使用了兩張圖像進行了測試,一張是內(nèi)容比較簡單的矢量圖,一張是寫實圖,效果如下:
可以看到,使用簡單的房子的圖像時,通過微調(diào)參數(shù),三種方法都可以達到比較接近的效果。但使用寫實的圖像(第二列)時,三者差異較大,skiamge庫的版本檢測出的角結果不是我們期望的。而且我通過調(diào)整參數(shù)也很難達到效果。原因還不清楚,有空再回頭分析一下corner_harris函數(shù)的源代碼。
以上示例的代碼:
from PIL import Image import matplotlib.pyplot as plt import numpy as np from skimage.feature import corner_harris, corner_peaks from scipy.ndimage import filters #harris_eps函數(shù)此處省略,見上文 im1 = np.array(Image.open("house.jpg").convert("L")) im2 = np.array(Image.open("tower-left.jpg").convert("L")) my_coords1 = corner_peaks(harris_eps(im1, sigma=1), min_distance=12, threshold_rel=0) eps_coords1 = corner_peaks(corner_harris(im1, method="eps", sigma=1), min_distance=20, threshold_rel=0) k_coords1 = corner_peaks(corner_harris(im1, method="k", sigma=1), min_distance=20, threshold_rel=0) my_coords2 = corner_peaks(harris_eps(im2, sigma=1), min_distance=5, threshold_rel=0.01) eps_coords2 = corner_peaks(corner_harris(im2, method="eps", sigma=1), min_distance=5, threshold_rel=0.01) k_coords2 = corner_peaks(corner_harris(im2, method="k", sigma=1), min_distance=5, threshold_rel=0.01) def plot_coords(index, title, im, coords): plt.subplot(index) plt.imshow(im) plt.plot(coords[:, 1], coords[:, 0], "+r", markersize=5) plt.title(title) plt.axis("off") plt.gray() index = 321 plot_coords(index, "my", im1, my_coords1) plot_coords(index + 1, "my", im2, my_coords2) plot_coords(index + 2, "skimage-eps", im1, eps_coords1) plot_coords(index + 3, "skimage-eps", im2, eps_coords2) plot_coords(index + 4, "skimage-k", im1, k_coords1) plot_coords(index + 5, "skimage-k", im2, k_coords2) plt.tight_layout(w_pad=0) plt.show()小結
下一筆記學習如何從圖像間找出相關的對應點。
你還可以查看我的其它筆記
wiki: Corner detection
skimage corner example
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37656.html
摘要:學習筆記七數(shù)學形態(tài)學關注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學習筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...
摘要:接下來的學習筆記本人都將使用來代替。庫中提供的很多圖像操作都是分別作用于某個通道的數(shù)據(jù)。是最流行的開源色彩管理庫之一。目前只支持在增加和。模塊支持從圖像對象創(chuàng)建或的對象,方便被使用和顯示。模塊對圖像或指定區(qū)域的每個通道進行統(tǒng)計,包括等。 介紹 《Programming Computer Vision with Python》是一本介紹計算機視覺底層基本理論和算法的入門書,通過這本收可以...
摘要:下面是二維空間的高斯分布函數(shù)公式這個公式被稱作高斯核。高斯模糊使用高斯平均算子來實現(xiàn)的圖像模糊叫高斯模糊,也叫高斯平滑被認為是一種最優(yōu)的圖像平滑處理。 SciPy庫 SciPy庫,與之前我們使用的NumPy和Matplotlib,都是scipy.org提供的用于科學計算方面的核心庫。相對NumPy,SciPy庫提供了面向更高層應用的算法和函數(shù)(其實也是基于NumPy實現(xiàn)的),并以子模塊...
摘要:簡稱庫是從擴展下來的,提供了更豐富的圖像處理函數(shù),去噪函數(shù)除了還有算法,比如邊緣檢測還有以前簡單提過的算子濾波器。下面我用看具體的例子,將和高斯平滑進行對比效果對比如下明顯感覺使用的效果要比高斯平滑好很多。 圖像去噪(Image Denoising)的過程就是將噪點從圖像中去除的同時盡可能的保留原圖像的細節(jié)和結構。這里講的去噪跟前面筆記提過的去噪不一樣,這里是指高級去噪技術,前面提過的...
閱讀 1408·2023-04-26 01:58
閱讀 2282·2021-11-04 16:04
閱讀 1753·2021-08-31 09:42
閱讀 1765·2021-07-25 21:37
閱讀 1066·2019-08-30 15:54
閱讀 2074·2019-08-30 15:53
閱讀 3047·2019-08-29 13:28
閱讀 2687·2019-08-29 10:56