我能够检测关键点和描述符
keypoints, des = surf.detectAndCompute(gray_image,None)
我能够绘制关键点
output_image = cv2.drawKeypoints(output_image, keypoints)
我能够从下面的图片中找到完全对应文字的关键点。我希望他们将文本复制到新图像上。
如何只绘制keypoints
引用的对象?
这是关键点的输出 keypoints only
最终,我希望仅关键点图像具有文本而不是关键点标记
答案 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)
您可以使用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)
现在我将其转换为灰度图像并应用阈值以对其进行二值化。然后我在这个图像上找到了轮廓,并用更大的半径绘制它们。
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)
我将其转换为灰度,将其二值化并用原始图像对其进行掩码以最终获得:
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)
如您所见,所需文本的某些部分是可见的。如果您使用surf
检测,则可以获得更多部分文字。