Удалите чернильную метку с бумаги с помощью OpenCV - PullRequest
0 голосов
/ 20 мая 2019

У меня есть изображение, подобное этому,

enter image description here

Как видите, на изображении есть отметка пером.Я хочу удалить эту отметку.Как это сделать в OpenCV.?

Я попытался преобразовать его в HSV, создать маску с синим диапазоном и удалить ее с помощью кода.

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
lower_blue = np.array([110,50,50]) 
upper_blue = np.array([130,255,255]) 

mask = cv2.inRange(hsv, lower_blue , upper_blue ) 
res = cv2.bitwise_and(img, img, mask= mask) 

Она не работает должным образом.Весь текст удаляется.Как это исправить .?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Попробуйте использовать inpaint. Сначала создайте маску из чернил:

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
lower_blue = np.array([100,50,50]) 
upper_blue = np.array([150,255,255]) 
kernel = np.ones((5,5),np.uint8)
mask = cv2.inRange(hsv, lower_blue, upper_blue)
mask = cv2.dilate(mask,kernel,iterations = 4)

mask

Используйте функцию inpaint, чтобы рисовать в областях, где маска белая. OpenCV выбрасывает исходные пиксели и использует предположение, какие пиксели должны идти туда.

dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)

enter image description here

1 голос
/ 20 мая 2019

Вы можете взять порог первого массива изображения. Это выглядит так:

first array

Здесь хорошо видна разница в пиксельных значениях чернильной метки и букв. После порога выглядит так:

thresholded image

Чернильная метка теперь может быть удалена путем закрытия. Однако это также уменьшит размер букв. Поэтому выполняется эрозия с последующим побитовым ИЛИ, чтобы получить нашу маску без чернильной метки.

mask

Если, однако, вы хотите, чтобы буквы выглядели как исходное изображение, вы можете сохранить маску в виде массива 255 с и выполнить его побитово ИЛИ с исходным изображением.

result

Полный код, который я использовал:

img = cv2.imread('ink_mark.png')
wimg = img[:, :, 0]
ret,thresh = cv2.threshold(wimg,100,255,cv2.THRESH_BINARY)

kernel = np.ones((7, 7), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
erosion = cv2.erode(closing, kernel, iterations = 1)
mask = cv2.bitwise_or(erosion, thresh)
white = np.ones(img.shape,np.uint8)*255
white[:, :, 0] = mask
white[:, :, 1] = mask
white[:, :, 2] = mask
result = cv2.bitwise_or(img, white)

cv2.imshow('image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...