具有对比度阈值的Open-CV 2.4密集SIFT

时间:2017-02-13 09:57:49

标签: python opencv sift

我正在尝试使用openCV-python 2.4来计算密集的SIFT

import cv2
def gen_sift_features(gray, step_size, gamma):
    dense = cv2.FeatureDetector_create("Dense")
    dense.setInt('initXyStep',step_size)
    kp = dense.detect(gray)

    sift = cv2.SIFT(contrastThreshold=gamma)
    kp, desc = sift.compute(gray, kp)
    return kp, desc

img = cv2.imread('myimage.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kp, desc = gen_sift_features(gray, 8, 0.01)

通常情况下,对比度阈值会滤除低对比度区域的关键点,但在这种情况下,它会被忽略,而openCV仍会为我提供所有关键点的筛选描述符。

enter image description here

在这种情况下,任何人都知道如何过滤低对比度描述符? 谢谢你的帮助!

编辑:我试图仔细观察并删除所有空描述符

remove = []
for i in range(0,len(desc)):
   if sum(desc[i])==0:
       remove.append(i)

np.delete(desc,remove)
for i in sorted(remove, reverse=True):
    del kp[i]

enter image description here

但是当我更改了contrastThreshold时,结果仍然相同!!!! 好像参数仍然是忽略

1 个答案:

答案 0 :(得分:1)

考虑到您的示例,我只需使用拉普拉斯滤波器[0]来查找高频区域(另请参阅opencv [1]的边缘检测教程)。然后,您可以通过对其进行阈值处理并使用np.where检索蒙版的活动像素来在掩码中转换其响应:

import numpy as np
import cv2

def find_high_contrast_key_points(img, threshold):
    laplacian = cv2.Laplacian(img,cv2.CV_64F)
    high_contrast_r, high_contrast_c = np.where(laplacian > threshold)

    kp = [cv2.KeyPoint(x, y, 1) for y, x in zip(high_contrast_r, high_contrast_c)]

    return kp

OpenCV中的cv2.Laplacian过滤器采用您可能想要使用的大小参数。拉普拉斯输出的其他修改也可以通过形态学操作来完成[2]。

[0] http://docs.opencv.org/3.0-beta/modules/imgproc/doc/filtering.html?highlight=laplacian#cv2.Laplacian

[1] http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_gradients/py_gradients.html

[2] http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html?highlight=morphology