#python-3.x #opencv
#python-3.x #opencv
Вопрос:
Изображение формы содержит текст на другом фоне. Изображение должно быть преобразовано в один фон (здесь белый), и, следовательно, заголовок должен быть преобразован в черный.
входное изображение :
Мой подход заключался в том, чтобы определить сетку (горизонтальные и вертикальные линии и суммировать их), а затем обрезать каждую часть сетки в новые вложенные изображения, а затем проверить цвет большинства пикселей и соответствующим образом преобразовать. Но после реализации этого синее фоновое изображение не обнаруживается и обрезается, как :
Итак, я пытаюсь преобразовать все изображение формы в один фон, чтобы избежать таких результатов.
Ответ №1:
Вот другой способ сделать это, который позволит справиться с тем, что «обратное видео» будет черным, вместо того, чтобы полагаться на некоторую насыщенность цвета, чтобы найти его.
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image, greyscale and threshold
im = cv2.imread('form.jpg',cv2.IMREAD_GRAYSCALE)
# Threshold and invert
_,thr = cv2.threshold(im,127,255,cv2.THRESH_BINARY)
inv = 255 - thr
# Perform morphological closing with square 7x7 structuring element to remove details and thin lines
SE = np.ones((7,7),np.uint8)
closed = cv2.morphologyEx(thr, cv2.MORPH_CLOSE, SE)
# DEBUG save closed image
cv2.imwrite('closed.png', closed)
# Find row numbers of dark rows
meanByRow=np.mean(closed,axis=1)
rows = np.where(meanByRow<50)
# Replace selected rows with those from the inverted image
im[rows]=inv[rows]
# Save result
cv2.imwrite('result.png',im)
Результат выглядит так:
И промежуточное closed
изображение выглядит так — я искусственно добавил красную рамку, чтобы вы могли видеть ее размер на белом фоне Stack Overflow:
Вы можете прочитать о морфологии здесь и отличное описание Энтони Тиссена, здесь .
Ответ №2:
Вот возможный подход. Оттенки синего будут отображаться с более высокой насыщенностью, чем черно-белые, если вы преобразуете в цветовое пространство HSV, поэтому…
- преобразовать в HSV
- найдите среднюю насыщенность для каждой строки и выберите строки, где средняя насыщенность превышает пороговое значение
- измените оттенки серого на эти строки, инвертируйте и порогуйте их
Этот подход должен работать, если обратные (выделяющиеся) фоны имеют любой цвет, отличный от черного или белого. Предполагается, что вы изменили свои изображения, чтобы они были действительно вертикальными / горизонтальными в соответствии с вашим примером.
В Python это может выглядеть примерно так:
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image
im = cv2.imread('form.jpg')
# Make HSV and extract S, i.e. Saturation
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
s=hsv[:,:,1]
# Save saturation just for debug
cv2.imwrite('saturation.png',s)
# Make greyscale version and inverted, thresholded greyscale version
gr = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
_,grinv = cv2.threshold(gr,127,255,cv2.THRESH_BINARY_INV)
# Find row numbers of rows with colour in them
meanSatByRow=np.mean(s,axis=1)
rows = np.where(meanSatByRow>50)
# Replace selected rows with those from the inverted, thresholded image
gr[rows]=grinv[rows]
# Save result
cv2.imwrite('result.png',gr)
Результат выглядит так:
Изображение насыщенности выглядит следующим образом — обратите внимание, что насыщенные цвета (т. Е. Синий) Отображаются как светлые, все остальное как черное:
Перевернутое изображение в оттенках серого выглядит следующим образом:
Комментарии:
1. Этот подход был хорош… Но как насчет черно-белых изображений? Было бы здорово, если бы вы могли помочь мне с общим подходом, поскольку моя форма ввода может быть любой… даже черно-белые изображения………
2. Я рассматриваю другую технику, которая включает
findContours()
в себя и вычисляет размер и средний цвет каждого контура, чтобы найти сильно затемненные поля. Я опубликую новый ответ, если он заработает.