Чтобы найти координаты X и Y области печати (текст или изображение) в документе, используя openCV в python - PullRequest
2 голосов
/ 17 марта 2020

У меня есть входное изображение Input Image. Я хочу найти макет документа области Текст. Я попытался использовать "Выпуклый корпус"

Когда я делаю "Выпуклый корпус" и нарисую для него счетчик. Вывод: Output Image

Это НЕ маркировка документа Печатная область. Как мы можем найти координаты X и Y

Ниже приведен код

import cv2
# Load the image
img1 = cv2.imread(r'TestImage.jpg')
# Convert it to greyscale
img = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# Threshold the image
ret, thresh = cv2.threshold(img,50,255,0)
# Find the contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# For each contour, find the convex hull and draw it
# on the original image.
hull=[]
for i in range(len(contours)):
    hullv=cv2.convexHull(contours[i])
    hull.append(cv2.convexHull(contours[i]))
    # print(hull)
    cv2.drawContours(img1, [hullv], -1, (255, 0, 0), 2)

cv2.imwrite(r"contours1.png",img1)

1 Ответ

1 голос
/ 18 марта 2020

Если у всех ваших документов есть изображение в правом углу, а остальная часть - текст, то один из способов сделать это - преобразовать изображение в черно-белое, сделать морфологическое закрытие, чтобы закрыть некоторые пробелы с помощью С уважением к тексту и подвести итог каждой строке. Затем вы можете найти точку, где есть очень большой всплеск, который обозначает, где начинается текст. Причина, по которой это работает, заключается в том, что текст охватывает большую часть столбцов в изображении для каждой строки, тогда как изображение охватывает только небольшую часть столбцов. Когда вы пройдете вниз по каждой строке и вычислите общее количество ненулевых пикселей в каждой строке, вы будете получать относительно небольшие суммы, пока не встретите первую строку текста, которая даст вам очень большие изменения в профиле суммы. Где происходит это изменение, где начинается ваш текст. Вы можете обрезать от этой точки до конца документа. Я хотел бы отметить одну вещь: ваш текст темный на светлом фоне. При преобразовании в двоичный код нам нужно инвертировать этот белый текст на темном фоне, чтобы сработала сумма строки logi c.

Примерно так может работать:

import cv2
import numpy as np

# Read in image, convert to grayscale, then convert to binary
im = cv2.imread('OghQo.jpg') # Downloaded from Stack Overflow and read offline
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
_, im_bw = cv2.threshold(im_gray, 5, 255, cv2.THRESH_BINARY_INV)

# Performing morphological closing
se = np.ones((20, 30), dtype=np.uint8)
im_bw2 = cv2.morphologyEx(im_bw, cv2.MORPH_CLOSE, se)

# Calculate row sums
row_sums = im_bw2.sum(axis=1)

# Find the row which exceeds the threshold
threshold_row = 80000
row_index = np.argmax(row_sums > threshold_row)

# Crop the image with a bit of breathing room
buffer_size = 10
crop = im[row_index - buffer_size:]

# Show the image
cv2.imshow("Cropped", crop)
cv2.waitKey(0)
cv2.destroyAllWindows()

Порог, с которым я играл, пока не получил что-то разумное. Теперь мы получаем:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...