python - 如何在 OpenCV 的特征提取过程中忽略图像的一部分?

标签 python opencv numpy sift orb

我正在尝试从矩形图像中提取特征。但是我想忽略图像的某​​些部分,这样就不会从图像内部的这些区域中提取任何特征。我可以想到两种方法。

a) 从整个图像中获取特征并使用关键点丢弃位于忽略区域内的特征。但这种方法不是首选,因为我已经限制了要从图像中提取的最大特征数量,稍后丢弃将无助于获得恒定数量的特征。

b) 使图像那部分的像素为 numpy 零。但我认为 SIFT/ORB 或其他特征提取算法可能会将其检测为黑色矩形,并在这个黑化框的边缘部分错误地创建特征。虽然对此不确定。

有人可以确认问题陈述的最佳方法吗?

最佳答案

您有两种方法可以检测图像选定部分的特征。

方法一:

通过选择 ROI。这种方法的缺点是计算出的特征点会有ROI的坐标。例如,如果您有尺寸为 width = 400, height = 400 的图像, 你选择一个带有暗淡 x=0, y=0, width=100, height=100 的 ROI ,关键点将根据 ROI dims 具有坐标。您必须手动将它们映射回原始图像大小。

img = cv2.imread("image.jpg", -1)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# select and ROI with user specified dimensions
roi = gray[50:150,50:150]

sift = cv2.xfeatures2d.SIFT_create()

kp = sift.detect(roi)

img=cv2.drawKeypoints(roi,kp,img)

Original roi

方法二:

为筛选特征检测器方法提供掩码。掩码必须是单 channel 、无符号字符图像。

img = cv2.imread("image.jpg", -1)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# create a mask image filled with zeros, the size of original image
mask = np.zeros(img.shape[:2], dtype=np.uint8)

# draw your selected ROI on the mask image
cv2.rectangle(mask, (50,50), (150,150), (255), thickness = -1)

sift = cv2.xfeatures2d.SIFT_create()

# provide mask to the detect method
kp = sift.detect(gray,mask)

img=cv2.drawKeypoints(gray,kp,img)

masked

关于python - 如何在 OpenCV 的特征提取过程中忽略图像的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46447073/

相关文章:

python - python数组中仅连续值的总和

python - 我可以在 VBA 中使用我的 python 自定义对象吗?

python - 将值分配给 numpy 数组中的位置而不修改数组

python - tf.keras 中的批量标准化不计算平均均值和平均方差

c++ - 在 Xcode 中为 OpenCV 组合两个 c++ 文件(使用未声明的标识符 CVSquares)

c++ - OpenCV:访问并求像素的平方根

matlab - OpenCV-如何使用C++计算黎曼距离?

python - numpy中分数的线性系统解决方案

Python For 循环(迭代变量名 = 列表名)

python - 阿尔法中的贝塔 贝塔搜索