我正在尝试使用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 :(得分: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