在OpenCV中提取特征时如何忽略图像的一部分?

Deb*_*tra 1 python opencv numpy sift orb

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

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

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

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

zin*_*rod 6

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

方法1:

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

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)
Run Code Online (Sandbox Code Playgroud)

原版的 投资回报率

方法2:

为筛选特征检测器方法提供遮罩。掩码必须是单个通道的未签名字符图像。

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)
Run Code Online (Sandbox Code Playgroud)

蒙面的


Kam*_*lag 0

这取决于你有多少地区。对于相对少量的区域,您可以只使用 ROI(感兴趣区域)

https://www.learnopencv.com/how-to-select-a-bounding-box-roi-in-opencv-cpp-python/

您可以定义矩形区域并计算每个区域的特征。