Извлечь строки из изображения с текстом

Я следил за изображением:

Извлечь строки из изображения с текстом

Я хочу извлечь из него только строки — только строки без текста.

Как лучше всего это сделать?

Я попробовал использовать библиотеку Python cv2 и HoughLinesP, следуя коду:

img = cv2.imread('/Users/tekija/Documents/image.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_thr = cv2.threshold(img_gray, 120, 255, cv2.THRESH_BINARY)
lines = cv2.HoughLinesP(
img_thr, rho=1, theta=np.pi / 180, threshold=128, minLineLength=600, maxLineGap=30)
lines = lines.squeeze()

но результаты:

Всегда ли линии одного и того же цвета?

DaSt 11.08.2024 00:48

Всегда ли линии цветные, а не черные? Если это так, вы можете использовать насыщенность из HSV, чтобы найти их обычно.

fmw42 11.08.2024 01:28

Альтернативно, получите контуры и отфильтруйте по длине, чтобы исключить короткие из символов.

fmw42 11.08.2024 01:30

Было ли это полезно: Хороший подход к обнаружению линий на изображении?

Bill 11.08.2024 02:23

@DaSt да, линии всегда одного цвета. Иное, чем текст полигонов.

user2727167 11.08.2024 11:40

@ fmw42 Да, линии всегда окрашены, но цвет не уникален для каждого изображения.

user2727167 11.08.2024 11:43

@user2727167 user2727167 Итак, попробуйте преобразовать в HSV и посмотреть канал насыщения. У вас должна быть возможность установить порог для извлечения только строк. Возможно, вам придется заняться морфологией, чтобы удалить небольшие пятна, оставшиеся от текста, или получить контуры и выбросить небольшие фрагменты.

fmw42 11.08.2024 18:13

это в контексте приложения ГИС, не так ли? тот, кто предоставит эти изображения, также может предоставить вам исходные данные ГИС.

Christoph Rackwitz 11.08.2024 18:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я лишь немного изменил ваш код. Добавлена ​​инверсия и изменены параметры.

import cv2
import numpy as np
img = cv2.imread('lines.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_thr = cv2.threshold(img_gray, 120, 255, cv2.THRESH_BINARY_INV)[1]
lines = cv2.HoughLinesP(img_thr, rho=1, theta=np.pi / 180/30, threshold=60, minLineLength=150, maxLineGap=4)
lines = lines.squeeze()
for i in range(lines.shape[0]):
    cv2.line(img, (lines[i,0], lines[i,1]), (lines[i,2], lines[i,3]), (255,0,0),2)
cv2.imwrite('lines_out.png', img)

Мне нравится ваше улучшение, но в правом нижнем углу изображения не хватает части.

DaSt 13.08.2024 13:40

Попробуйте исправить параметр minLineLength.

Alex Alex 13.08.2024 14:14
Ответ принят как подходящий

Поскольку вы подтвердили, что линии всегда имеют один и тот же цвет, имеет смысл сначала отфильтровать по этому цвету, а затем обнаружить линии.

import cv2
import numpy as np

# Load image
image = cv2.imread('demo.png')

# Convert to HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# Define color range (original is #7e3553)
lower_range = np.array([155, 100, 20])
upper_range = np.array([175, 255, 255])

# Create mask
mask = cv2.inRange(hsv_image, lower_range, upper_range)

# Dilate the mask to fill in small gaps
mask = cv2.dilate(mask, (3,3), iterations=2)

# Detect points that form a line
lines = cv2.HoughLinesP(mask, 1, np.pi/180, 100, minLineLength=10, maxLineGap=250)

# Draw lines on new mask
line_mask = np.zeros(image.shape[:2], dtype=np.uint8)
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(line_mask, (x1, y1), (x2, y2), 255, 3)

# Erode to thin the lines
line_mask = cv2.erode(line_mask, (3,3), iterations=2)

cv2.imwrite('demo_output.png', line_mask)

Вот результат, обратите внимание, как закрылись все пробелы вверху и внизу справа:

Другие вопросы по теме