Как преобразовать фон всего изображения в белый, когда присутствуют как белый, так и черный фон?

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