我正在尝试从矩形图像中提取特征。但是我想忽略图像的某些部分,因此不会从图像中的这些区域中提取任何特征。我可以想到两种方法。
a)从整个图像中获取要素,并使用关键点丢弃忽略区域内的要素。但是这种方法并不是首选方法,因为我对从图像中提取的最大特征数量进行了限制,并且稍后在获得恒定数量的特征时不会丢弃。
b)使图像部分的像素为零。但我认为SIFT / ORB或其他特征提取算法可能会将其检测为黑色矩形,并在此黑化框的边缘部分错误地创建特征。虽然对此不太确定。
有人可以确认问题陈述的最佳方法吗?
答案 0 :(得分:4)
您有两种方法可以检测图像选定部分的功能。
方法1:
选择投资回报率。该方法的缺点是计算的特征点将具有ROI的坐标。例如,如果您的图片尺寸为width = 400, height = 400
,则选择带有调光x=0, y=0, width=100, height=100
的投影机,关键点将根据投资回报率调暗设置坐标。您必须手动将它们映射回原始图像大小。
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)
方法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)
答案 1 :(得分:0)
这取决于你拥有多少个地区。对于相对较少的区域,您可以使用ROI(感兴趣的区域)
https://www.learnopencv.com/how-to-select-a-bounding-box-roi-in-opencv-cpp-python/
您可以定义矩形区域并计算每个区域的要素。