Вы можете взять порог первого массива изображения. Это выглядит так:
Здесь хорошо видна разница в пиксельных значениях чернильной метки и букв. После порога выглядит так:
Чернильная метка теперь может быть удалена путем закрытия. Однако это также уменьшит размер букв. Поэтому выполняется эрозия с последующим побитовым ИЛИ, чтобы получить нашу маску без чернильной метки.
Если, однако, вы хотите, чтобы буквы выглядели как исходное изображение, вы можете сохранить маску в виде массива 255 с и выполнить его побитово ИЛИ с исходным изображением.
Полный код, который я использовал:
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()