成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Programming Computer Vision with Python (學(xué)習(xí)筆記九)

focusj / 1774人閱讀

摘要:角檢測(cè)還可以用在運(yùn)動(dòng)檢測(cè)物體識(shí)別等方面。角檢測(cè)角檢測(cè)也叫角檢測(cè)是目前可用的最簡(jiǎn)單的角檢測(cè)算法。為使得計(jì)算更方便,角測(cè)量給出了去除系數(shù)的方法,只要計(jì)算或?yàn)橐粋€(gè)很小的正的常量,我們暫且稱此為方法。你還可以查看我的其它筆記參考資料

角檢測(cè)(Corner detection)是指檢測(cè)圖像中具有代表性的(我們感興趣的)角點(diǎn),一般講為形狀或邊緣的拐角處,這些點(diǎn)可以大略標(biāo)記對(duì)象在圖像中的輪廓和位置,如果從一個(gè)圖像序列中檢測(cè)每個(gè)圖像的角點(diǎn),就可以找出圖像之間存在的相關(guān)和相對(duì)應(yīng)的角點(diǎn),這對(duì)比如全景拼接(多張圖片拼接成一張全景圖片)很有用。
角檢測(cè)還可以用在運(yùn)動(dòng)檢測(cè)、物體識(shí)別等方面。

Harris角檢測(cè)

Harris角檢測(cè)(也叫Harris & Stephens角檢測(cè))是目前可用的最簡(jiǎn)單的角檢測(cè)算法。它的基本思路是這樣的:對(duì)于圖像中的一個(gè)點(diǎn),如果它周圍存在1個(gè)以上不同方向的邊緣,這個(gè)點(diǎn)所在處就是角。

下面需要粗略地介紹一下其中的數(shù)學(xué)原理,以便理解Harris濾波器函數(shù)參數(shù)的作用。

我們之前學(xué)習(xí)邊緣檢測(cè)的時(shí)候知道,邊緣上的點(diǎn),水平和垂直兩個(gè)方向的梯度幅度(一階導(dǎo)數(shù))較周圍高,如果要檢測(cè)點(diǎn)所在處是否具有1個(gè)方向以上的邊緣,就必須要綜合它周圍點(diǎn)的梯度一起考慮,那么問(wèn)題就變成了需要計(jì)算周圍區(qū)域,像素兩兩之間的梯度關(guān)系,我們?cè)趯W(xué)習(xí)PCA算法的時(shí)候知道協(xié)方差矩陣能體現(xiàn)這種關(guān)系,設(shè)Ix為點(diǎn)x在它周圍一小塊區(qū)域內(nèi)的水平方向梯度,同樣,設(shè)Iy為點(diǎn)y垂直方向梯度,組成一個(gè)協(xié)方差矩陣:

在點(diǎn)(x,y)附近一小塊區(qū)域內(nèi),離(x,y)越近,關(guān)系越大,這就需要考慮加權(quán)計(jì)算,設(shè)加權(quán)算子為W(典型值使用高斯核,之前筆記介紹過(guò)),得到:
A = W * M

A被稱為Harris矩陣,它兩個(gè)特征值λ1和λ2,如果:

λ1和λ2都為較大的正數(shù),表示對(duì)應(yīng)的(x,y)點(diǎn)處是角

若λ1較大,而且λ2約等于0,表示所在點(diǎn)只有一條邊,非角

若λ1和λ2都約等于0,表示所在處沒(méi)有邊角

求Harris矩陣的特征值計(jì)算量較大,Harris給出了一個(gè)方程:

上式只要計(jì)算矩陣的行列式(det)和跡(trace)即可,計(jì)算方便,得到的結(jié)果可作為角的檢測(cè),其中系數(shù)k是一個(gè)經(jīng)驗(yàn)值,它的設(shè)置跟邊緣的粗細(xì)有關(guān)。我們暫且把這種方法稱為k方法。

為使得計(jì)算更方便,Noble角測(cè)量(Noble’s corner measure)給出了去除k系數(shù)的方法,只要計(jì)算:

eps(或?)為一個(gè)很小的正的常量,我們暫且稱此為eps方法。

Harris代碼實(shí)現(xiàn)
根據(jù)以上所介紹的eps方法,下面實(shí)現(xiàn)一個(gè)Harris角檢測(cè)函數(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)
    #計(jì)算兩兩之間的一階導(dǎo)數(shù)
    Wxx = filters.gaussian_filter(imx*imx,sigma)
    Wxy = filters.gaussian_filter(imx*imy,sigma)
    Wyy = filters.gaussian_filter(imy*imy,sigma)
    #計(jì)算行列式
    Wdet = Wxx*Wyy - Wxy**2
    #計(jì)算矩陣的跡
    Wtr = Wxx + Wyy
    #按eps公式計(jì)算
    return Wdet * 2 / (Wtr + 1e-06)

注意:書上并沒(méi)有嚴(yán)格按照公式計(jì)算返回值,經(jīng)測(cè)試,對(duì)某些圖片會(huì)出現(xiàn)無(wú)法除的情況,所以上面的代碼進(jìn)行了改正

確定坐標(biāo)
Harris返回的結(jié)果是一個(gè)與原圖像大小相同的矩陣,要判斷是否是角點(diǎn),還需要做如下的工作:

設(shè)定一個(gè)閾值,只考慮高于閾值的點(diǎn),這樣可以過(guò)濾掉無(wú)用的或不感興趣的點(diǎn)

一個(gè)角處一般會(huì)有多個(gè)點(diǎn),在標(biāo)記角坐標(biāo)的時(shí)候,應(yīng)該設(shè)定一個(gè)最小距離,在此距離內(nèi)只需要一個(gè)點(diǎn)進(jìn)行標(biāo)記即可

這個(gè)判斷函數(shù)可以使用skimage庫(kù)中的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ù)默認(rèn)返回由所有角點(diǎn)在原圖像中的坐標(biāo)組成的數(shù)組。

skimage庫(kù)的Harris函數(shù)

skimage庫(kù)也提供了Harris角檢測(cè)函數(shù):

skimage.feature.corner_harris(image, method="k", k=0.05, eps=1e-06, sigma=1)

method: "k"或"eps",對(duì)應(yīng)上述的兩種計(jì)算方法
k: k方法中的k系數(shù),取值區(qū)間為[0, 0.2],k的值越小,表示將檢測(cè)越銳利的角
eps: eps方法中的系數(shù),默認(rèn)即可
sigma: 高斯核的標(biāo)準(zhǔn)差

簡(jiǎn)單示例:

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結(jié)果中檢測(cè)角的坐標(biāo)位置
>>[[2 2]
 [2 7]
 [7 2]
 [7 7]]

上面harris_result如圖,觀察一下角處的值與周圍的不同:

對(duì)比示例

我分別用我們自己實(shí)現(xiàn)的harris_eps函數(shù),跟skimage中的corner_harris函數(shù)進(jìn)行效果對(duì)比,發(fā)現(xiàn)兩者存在差異,有使用了兩張圖像進(jìn)行了測(cè)試,一張是內(nèi)容比較簡(jiǎn)單的矢量圖,一張是寫實(shí)圖,效果如下:

可以看到,使用簡(jiǎn)單的房子的圖像時(shí),通過(guò)微調(diào)參數(shù),三種方法都可以達(dá)到比較接近的效果。但使用寫實(shí)的圖像(第二列)時(shí),三者差異較大,skiamge庫(kù)的版本檢測(cè)出的角結(jié)果不是我們期望的。而且我通過(guò)調(diào)整參數(shù)也很難達(dá)到效果。原因還不清楚,有空再回頭分析一下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ù)此處省略,見(jiàn)上文

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()
小結(jié)

下一筆記學(xué)習(xí)如何從圖像間找出相關(guān)的對(duì)應(yīng)點(diǎn)。
你還可以查看我的其它筆記

參考資料

wiki: Corner detection
skimage corner example

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37656.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.30 - 學(xué)習(xí) Python 來(lái)做一些神奇好玩的事情吧

    摘要:學(xué)習(xí)筆記七數(shù)學(xué)形態(tài)學(xué)關(guān)注的是圖像中的形狀,它提供了一些方法用于檢測(cè)形狀和改變形狀。學(xué)習(xí)筆記十一尺度不變特征變換,簡(jiǎn)稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡(jiǎn)明扼要地說(shuō)明的編碼機(jī)制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來(lái)看這樣一個(gè)提問(wèn): pyth...

    lifesimple 評(píng)論0 收藏0
  • Programming Computer Vision with Python學(xué)習(xí)筆記一)

    摘要:接下來(lái)的學(xué)習(xí)筆記本人都將使用來(lái)代替。庫(kù)中提供的很多圖像操作都是分別作用于某個(gè)通道的數(shù)據(jù)。是最流行的開源色彩管理庫(kù)之一。目前只支持在增加和。模塊支持從圖像對(duì)象創(chuàng)建或的對(duì)象,方便被使用和顯示。模塊對(duì)圖像或指定區(qū)域的每個(gè)通道進(jìn)行統(tǒng)計(jì),包括等。 介紹 《Programming Computer Vision with Python》是一本介紹計(jì)算機(jī)視覺(jué)底層基本理論和算法的入門書,通過(guò)這本收可以...

    huashiou 評(píng)論0 收藏0
  • Programming Computer Vision with Python學(xué)習(xí)筆記五)

    摘要:下面是二維空間的高斯分布函數(shù)公式這個(gè)公式被稱作高斯核。高斯模糊使用高斯平均算子來(lái)實(shí)現(xiàn)的圖像模糊叫高斯模糊,也叫高斯平滑被認(rèn)為是一種最優(yōu)的圖像平滑處理。 SciPy庫(kù) SciPy庫(kù),與之前我們使用的NumPy和Matplotlib,都是scipy.org提供的用于科學(xué)計(jì)算方面的核心庫(kù)。相對(duì)NumPy,SciPy庫(kù)提供了面向更高層應(yīng)用的算法和函數(shù)(其實(shí)也是基于NumPy實(shí)現(xiàn)的),并以子模塊...

    Rocko 評(píng)論0 收藏0
  • Programming Computer Vision with Python學(xué)習(xí)筆記八)

    摘要:簡(jiǎn)稱庫(kù)是從擴(kuò)展下來(lái)的,提供了更豐富的圖像處理函數(shù),去噪函數(shù)除了還有算法,比如邊緣檢測(cè)還有以前簡(jiǎn)單提過(guò)的算子濾波器。下面我用看具體的例子,將和高斯平滑進(jìn)行對(duì)比效果對(duì)比如下明顯感覺(jué)使用的效果要比高斯平滑好很多。 圖像去噪(Image Denoising)的過(guò)程就是將噪點(diǎn)從圖像中去除的同時(shí)盡可能的保留原圖像的細(xì)節(jié)和結(jié)構(gòu)。這里講的去噪跟前面筆記提過(guò)的去噪不一樣,這里是指高級(jí)去噪技術(shù),前面提過(guò)的...

    FleyX 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<