2017-09-27 80 views
1

我想從矩形圖像中提取特徵。但我想忽略圖像的某​​些部分,因此圖像內部的這些區域不會提取任何特徵。我可以想到兩種方法。如何在OpenCV中的特徵提取過程中忽略圖像的一部分?

a)從整個圖像中獲取特徵,並使用關鍵點丟棄位於忽略區域內的特徵。但是這種方法並不是首選,因爲我已經對從圖像中提取的特徵的最大數量進行了限制,稍後丟棄將無助於獲取恆定數量的特徵。 b)將圖像那部分上的像素設爲零點零。但我認爲SIFT/ORB或其他特徵提取算法可能會將其檢測爲黑色矩形,並在此黑色框的邊緣部分錯誤地創建特徵。雖然不確定這一點。

有人可以確認問題陳述的最佳方法嗎?

+0

我不是球體和篩選的專家,只是裁剪你想要的,你不會做的伎倆的區域? –

回答

0

這取決於你有多少地區。對於區域的相對少量的你可以使用ROI(感興趣區域)

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

您可以定義的矩形區域,並計算功能,爲每個區域。

+0

以這種方式在ROI上查找功能的缺點是,在特徵提取後,您必須將這些點映射回原始圖像大小。最好的方法是將ROI設置爲掩碼。 – zindarod

+0

@Zindarod感謝映射評論。我認爲映射座標的計算花費比計算掩碼要少。 –

3

您有兩種方法可以檢測圖像選定部分的特徵。

方法1:

通過選擇ROI。這種方法的缺點是計算出的特徵點將具有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) 

Originalroi

方法2:

提供掩模以SIFT特徵檢測器方法。掩碼必須是單個通道,無符號字符圖像。

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