1

我正在研究使用openCV改變不同參數對哈里斯角點檢測器的錯誤率的影響。輸入參數是窗口大小,sobel運算符的內核大小和k參數的值。我發現,當我增加窗口大小時,每個角落的響應數量似乎有所增加。例如,如果每個包含一個角的窗口都用一個點標記,那麼當我使用7x7窗口而不是2x2窗口時,在標識的角落周圍出現密度較高的點。更改窗口大小似乎也會增加正確識別的角點數量。窗口大小對openCV中哈里斯角點檢測器的結果有什麼影響

我的編碼如下,這是我從this例如有

import cv2 
 
import numpy as np 
 

 
filename = 'resized_image.jpg' 
 
img = cv2.imread(filename) 
 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
 

 
gray = np.float32(gray) 
 
dst = cv2.cornerHarris(gray,7,3,0.015) 
 

 
#result is dilated for marking the corners, not important 
 
dst = cv2.dilate(dst,None) 
 

 
# Threshold for an optimal value, it may vary depending on the image. 
 
img[dst>0.05*dst.max()]=[0,0,255] 
 
cv2.imwrite('corners3.jpg', img) 
 
cv2.imshow('dst',img) 
 
if cv2.waitKey(0) & 0xff == 27: 
 
    cv2.destroyAllWindows()

可能有人請解釋對Harris角點檢測的結果增加了窗口大小的影響。具體爲什麼每個角落的響應數量隨着窗口大小的增加而增加。我的理解是,這個函數計算窗口梯度,並使用sobel運算符執行一些平滑處理,如果這對結果有影響的話。對不起,如果這是一個明顯的問題,但我只是新的計算機視覺。

+0

這是奇怪的...你能請出示你的代碼的相關部分? – sansuiso

回答

2

你是什麼意思的「每角落響應」?在「真實」拐角位置的一般附近看到探測器響應中出現多個峯值簇是很正常的。發生這種情況是因爲響應函數對於自然圖像而言是平滑的 - 畢竟它計算的是衍生物的產物,它放大了原始圖像中的任何「隨機」振盪。哈里斯的所有過濾器都是爲了找到這樣一些地方,這個不平滑的函數強烈地尖峯化,但是即使你對圖像的直覺告訴你他們不應該,峯值也可以彼此接近。爲了解決這個問題,一個明顯的技術是計算「平滑導數」(即Gx * I,而不是Ix,其中G是一個小的高斯內核等),但這有副作用,即一些「弱「角落可能會變得平滑。不管是否使用平滑衍生物,用於解決這個問題並獲得期望的N個「乾淨」角的簡單算法是從響應中選擇通過減少檢測器響應排序的k * N個最強峯值強度(以k表示,在5至10範圍內),然後:

  1. 從列表中選擇下一個峯值。
  2. 在其位置(x,y)查找Harris探測器響應值H(x,y)。
  3. 如果H(x,y)> 0,將它添加到輸出乾淨的角點列表中,然後在(x,y)的一個小的m×m鄰域中將H(u,v)的所有值設置爲0。
  4. 否則跳過這個高峯。
  5. 如果輸出列表的大小小於N並且還有任何峯值,則轉到1。

「聚類」抑制鄰域的寬度m應該表示您先前的信息,說明「真實」角點應該相距多遠。這種方法顯然假設羣集的「最佳」角落是具有最強哈里斯濾波器響應的角落。

順便說一句,如果你的名字(或谷歌搜索),這通常被稱爲「非局部極大值抑制」。

BTW-2:見this answer的詳細信息,發現爲H響應的所有局部最大值,待再由響應值等來分類

相關問題