OpenCV - 仅绘制关键点使用python引用的对象

时间:2017-02-15 15:10:57

标签: python opencv image-processing

我能够检测关键点和描述符

keypoints, des = surf.detectAndCompute(gray_image,None)

我能够绘制关键点

output_image = cv2.drawKeypoints(output_image, keypoints)

我能够从下面的图片中找到完全对应文字的关键点。我希望他们将文本复制到新图像上。

如何只绘制keypoints引用的对象?

source image

这是关键点的输出 keypoints only

最终,我希望仅关键点图像具有文本而不是关键点标记

1 个答案:

答案 0 :(得分:2)

看看这种方法。它不是那么整洁,但你可以根据自己的需要进行改进。

我使用cv2.ORB_create()获取了给定图像上的关键点,为此我得到了这个:

img = cv2.imread(filename,0)
orb = cv2.ORB_create()
kp = orb.detect(img,None)
kp, des = orb.compute(img, kp)

img2 = cv2.drawKeypoints(img,kp,None,color=(0,255,0), flags=0)
cv2.imshow('keypoint_on_text.jpg', img2)

enter image description here

您可以使用surf来更好地检测关键点。

然后,我获得了具有与图像相同形状的纯色(在这种情况下为黑色)的图像。我在这张黑色图像上绘制了这些获得的关键点。

mask = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
mask[:] = (0, 0, 0) 

fmask = cv2.drawKeypoints(mask,kp,None,color=(0,255,0), flags=0)
cv2.imshow('fmask.jpg', fmask)

enter image description here

现在我将其转换为灰度图像并应用阈值以对其进行二值化。然后我在这个图像上找到了轮廓,并用更大的半径绘制它们。

graymask = cv2.cvtColor(fmask,cv2.COLOR_BGR2GRAY)
ret, th = cv2.threshold(graymask, 50, 255, 0)
_, contours , _= cv2.findContours(th,2,1)
rep = cv2.drawContours(fmask, contours, -1, (0,255,0), 5)
cv2.imshow('contours.jpg',rep)

enter image description here

我将其转换为灰度,将其二值化并用原始图像对其进行掩码以最终获得:

repmask = cv2.cvtColor(rep,cv2.COLOR_BGR2GRAY)
ret, th1 = cv2.threshold(repmask, 50, 255, 0)
res = cv2.bitwise_and(img,img,mask = th1)
cv2.imshow('Only_Text.jpg',res)

enter image description here

如您所见,所需文本的某些部分是可见的。如果您使用surf检测,则可以获得更多部分文字。