我正在尝试使用 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 仍然为我提供所有关键点的筛选描述符。
有人知道在这种情况下如何过滤掉低对比度描述符吗? 感谢您的帮助!
编辑:我试图仔细观察并删除所有空描述符
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]
但是当我改变我的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
关于python - 具有对比度阈值的 Opencv 2.4 密集 SIFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42201204/