Проблемы с предварительной обработкой изображения, чтобы сделать текст более четким при подготовке к извлечению - PullRequest
0 голосов
/ 31 мая 2019

У меня есть изображения некоторых керамических тарелок. Показанный ниже пример худшего из партии. У меня возникают проблемы с предварительной обработкой перед использованием tesseract для получения текста (если это возможно). Если бы кто-то мог дать мне толчок в правильном направлении, то это было бы замечательно.

Пример необработанного изображения:

Плита необработанная

enter image description here

Я пробовал несколько вещей сам за последние 4 дня, и лучшее, что я мог придумать, это:

результирующее предварительно обработанное изображение

enter image description here

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

    import os
import numpy as np
import matplotlib.pyplot as plt
try:
    from cv2 import cv2
except ImportError:
    pass

cwd = os.path.dirname(os.path.abspath(__file__))
input_dir_path = cwd + '/data/input'
output_dir_path = cwd + '/data/output'

input_image_names = os.listdir(input_dir_path)


def nothing(x):
    pass

def makeValueOdd(value):
    if (value % 2) is not 0:
        return value
    return value + 1

wnd = 'Test'
cv2.namedWindow(wnd, cv2.WINDOW_NORMAL)
cv2.createTrackbar("Threshold", wnd, 127, 255, nothing)
cv2.createTrackbar("Blur", wnd, 3, 255, nothing)
cv2.createTrackbar("Lower_gray", wnd, 100, 255, nothing)
cv2.createTrackbar("Higher_gray", wnd, 255, 255, nothing)

img = cv2.imread(input_dir_path + '/' + input_image_names[0])
clahe = cv2.createCLAHE(clipLimit=4.3, tileGridSize=(8,8))


while (1):
    thresh_bin_val = cv2.getTrackbarPos("Threshold", wnd)
    blur_kernel_value = (makeValueOdd(cv2.getTrackbarPos("Blur", wnd)), 
    makeValueOdd(cv2.getTrackbarPos("Blur", wnd)))
    lower_val = cv2.getTrackbarPos("Lower_gray", wnd)
    higher_val = cv2.getTrackbarPos("Higher_gray", wnd)

    hsv_image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    lower_gray = np.array([0, 0, lower_val])
    higher_gray = np.array([0, 0, higher_val])

    mask = cv2.inRange(hsv_image, lower_gray, higher_gray)
    result = cv2.bitwise_and(img, img, mask=mask)
    gray_img = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)

    cl1 = clahe.apply(gray_img)

    blurr = cv2.GaussianBlur(cl1, blur_kernel_value, 0)
    ret, thresh1 = cv2.threshold(blurr, thresh_bin_val, 255, 
    cv2.THRESH_BINARY_INV)

    subtract = cv2.bitwise_not(thresh1)
    cv2.imshow(wnd, subtract)

    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break

    cv2.destroyAllWindows()
...