2017-02-15 1 views
0

Я в состоянии обнаружить ключевые точки и дескрипторыOpenCV - рисовать только объекты, которые ключевые точки относятся к использованию питона

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

Я могу рисовать ключевые точки

output_image = cv2.drawKeypoints(output_image, keypoints) 

Я могу найти ключевые точки с изображения ниже, которые идеально соответствуют тексту. Я хочу, чтобы они скопировали текст на новое изображение.

Как я могу нарисовать только объекты, на которые ссылаются keypoints?

source image

Вот выход из ключевых точек keypoints only

В конце концов я хочу ключевых точек только изображение, чтобы текст вместо из Keypoint маркеров

+0

Для этого вам может понадобиться идентифицировать объект в контексте. Затем, если 'keypoint' находится внутри обнаруженного объекта, вы можете выделить этот конкретный объект –

+0

Как вы определяете объект в контексте? –

+0

Можете ли вы загрузить образ, который вы работаете с –

ответ

0

ли взглянуть на этот подход. Это не так аккуратно, но вы можете усовершенствовать его в соответствии с вашими потребностями.

я получил на ключевые точки данного изображения с помощью 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, вы сможете получить больше части текста.

+0

Если вам нужна помощь в кодировании, пройдите. Надеюсь, это поможет. Там могут быть лучшие пути. Но это то, что меня поразило первым. : D –

+0

Можете ли вы представить, как вы это сделали: «Я преобразовал это в оттенки серого, выровнял его и замаскировал его оригинальным изображением, чтобы, наконец, получить это»? –

+0

Проверьте решение еще раз. Я добавил соответствующий код. –

Смежные вопросы