Как мне обрезать непрямую angular, не полигональную область интереса в opencv? - PullRequest
0 голосов
/ 31 марта 2020

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

Мне удалось найти контур объект, который выглядит следующим образом: contour

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

Вот входное изображение и код:

input image

import cv2
import numpy as np
import imutils

shape = cv2.imread("testImg.jpg")
resized = imutils.resize(shape, width=600)
gray = cv2.cvtColor(resized,cv2.COLOR_BGR2GRAY)
th3 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)[1]

cv2.imshow("th3",th3)

#find contours of thresh
contours, hierarchy = cv2.findContours(th3, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print("Number of Contours found = " + str(len(contours))) 

#a black screen
out = np.zeros_like(resized)
#copy of thresh
copy=th3.copy()

#find largest contour area and draw it
cntArea = []
for c in contours:
    cntArea.append(cv2.contourArea(c))
maxArea = max(cntArea)
maxIndex=cntArea.index(max(cntArea))
maxCnts=contours[maxIndex]
cv2.drawContours(out, maxCnts, -1, (0,255,0), 2)

cv2.imshow("out",out)
cv2.waitKey(0)
cv2.destroyAllWindows

Я пытался очистить контуры фона, но это не помогло работать из-за моего метода обнаружения OCR (изображение ниже не будет проходить через мой код OCR)

cleared out background

1 Ответ

0 голосов
/ 02 апреля 2020
  1. Создайте маску для требуемой области, в которой каждый пиксель внутри контура получит значение 1, а пиксели за пределами контура получат значение 0. Это можно сделать с помощью функции cv2.drawContours, установить толщину = cv2. FILLED. С цветом = (1, 1, 1)
  2. Используйте маску для умножения на исходное изображение. final_img = mask * original_img
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...