python - 具有对比度阈值的 Opencv 2.4 密集 SIFT

标签 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时,结果还是一样!!!! 似乎该参数仍被忽略

最佳答案

考虑到您的示例,我会简单地使用拉普拉斯滤波器 [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

关于python - 具有对比度阈值的 Opencv 2.4 密集 SIFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42201204/

相关文章:

python - 在 Python 中编译 C DLL 并与之交互可以在 Unix 上运行,但不能在 Windows 上运行。这样做的正确方法是什么?

Python 使用 if 语句对字典列表进行排序

python - 动态重新加载 Cython 模块

Unity : 4-point calibration/reprojection 的 OpenCV

python - 如何使用函数的返回值作为 while 的条件,在 python 中返回元组

opencv - 针对较暗阴影的线检测

c++ - openCV中SIFT检测到的关键点,其大小是相关区域的半径还是直径?

python - 不能使用来自opencv的SIFT算法

opencv - OpenCV-仅显示关键点而不使用SIFT显示图像

python - 无法安装 Beautifulsoup ("bs4 does not exist")