Как я могу сохранить только текст определенного цвета с изображения через opencv и python? - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть какое-то изображение счета-фактуры с некоторым перекрытием текста, что создает некоторые проблемы для дальнейшей обработки, и то, что я только, это текст в черном цвете.некоторые я хочу удалить текст, который в других цветах.

есть ли способ добиться этого?

изображение прилагается в качестве примера.

Я пыталсярешить это с помощью opencv, но я все еще не могу решить это:

import numpy as np import cv2
img = cv2.imread('11.png')

lower = np.array([150,150,150]) 

upper = np.array([200,200,200])

mask = cv2.inRange(img, lower, upper) 
res = cv2.bitwise_and(img, img, mask=mask) 
cv2.imwrite('22.png',res)

[изображение с несколькими цветами] [1]

[1]: https://i.stack.imgur.com/nWQrV.pngstrong текст

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Текст темнее и менее насыщенный.И как предложено как @JD, цветовое пространство HSV хорошо.Но его диапазон неверен.

В OpenCV, H колеблется в [0, 180], в то время как S / V колеблется в [0, 255]

Вот цветовая карта, которую я сделал в прошлом году, я думаюэто полезно.


(1) Использование cv2.inRange

(2) Просто пороговое значение для канала V(HSV):

th, threshed = cv2.threshold(v, 150, 255, cv2.THRESH_BINARY_INV)

(3) Просто пороговое значение для канала S(HSV):

th, threshed2 = cv2.threshold(s, 30, 255, cv2.THRESH_BINARY_INV)

Результат:

enter image description here


Демонстрационный код:

# 2018/12/30 22:21 
# 2018/12/30 23:25 

import cv2 

img = cv2.imread("test.png")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)

mask = cv2.inRange(hsv, (0,0,0), (180, 50, 130))
dst1 = cv2.bitwise_and(img, img, mask=mask)

th, threshed = cv2.threshold(v, 150, 255, cv2.THRESH_BINARY_INV)
dst2 = cv2.bitwise_and(img, img, mask=threshed)

th, threshed2 = cv2.threshold(s, 30, 255, cv2.THRESH_BINARY_INV)
dst3 = cv2.bitwise_and(img, img, mask=threshed2)

cv2.imwrite("dst1.png", dst1)
cv2.imwrite("dst2.png", dst2)
cv2.imwrite("dst3.png", dst3)

  1. Как обнаружить цветные пятна на изображении с помощью OpenCV?

  2. Как определить пороговое значение для обнаружения на изображении только объектов зеленого цвета: Opencv

0 голосов
/ 30 декабря 2018

Преобразование в цветовое пространство HSV облегчает выбор цветов.

Приведенный ниже код делает то, что вы хотите.Результат: enter image description here

import numpy as np 
import cv2

kernel = np.ones((2,2),np.uint8)
# load image
img = cv2.imread("image.png")

# Convert BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# define range of black color in HSV
lower_val = np.array([0,0,0])
upper_val = np.array([179,100,130])

# Threshold the HSV image to get only black colors
mask = cv2.inRange(hsv, lower_val, upper_val)

# Bitwise-AND mask and original image
res = cv2.bitwise_and(img,img, mask= mask)
# invert the mask to get black letters on white background
res2 = cv2.bitwise_not(mask)

# display image
cv2.imshow("img", res)
cv2.imshow("img2", res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Чтобы изменить выбранный уровень черного, настройте значение upper_val, в настоящее время установлено значение 130. Более высокое = разрешить более светлые оттенки (это называется значением).Также значение в настоящее время в 100: ниже = разрешить меньше цвета (на самом деле: насыщенность).Подробнее о цветовом пространстве HSV здесь .

Я всегда нахожу изображение ниже очень полезным.Нижний «диск» весь черный.При перемещении вверх по значению также выделяются более светлые пиксели.Пиксели с низкой насыщенностью остаются оттенками серого до белого (центр), пиксели с высокой насыщенностью окрашиваются (край). Вот почему вы настраиваете эти значения.enter image description here

Редактировать : Как отметил @Silencer, мой диапазон был отключен.Исправлено.

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