Фильтрация изображения для улучшения распознавания текста

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

Image1

С помощью python и opencv я попытался удалить строки на заднем плане с помощью k-means с k = 2, и в результате получилось

Image2

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

def process_image_for_ocr(file_path):
# TODO : Implement using opencv
temp_filename = set_image_dpi(file_path)
im_new = remove_noise_and_smooth(temp_filename)
return im_new


def set_image_dpi(file_path):
    im = Image.open(file_path)
    length_x, width_y = im.size
    factor = max(1, int(IMAGE_SIZE / length_x))
    size = factor * length_x, factor * width_y
    # size = (1800, 1800)
    im_resized = im.resize(size, Image.ANTIALIAS)
    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.jpg')
    temp_filename = temp_file.name
    im_resized.save(temp_filename, dpi=(300, 300))
    return temp_filename


def image_smoothening(img):
    ret1, th1 = cv2.threshold(img, BINARY_THREHOLD, 255, cv2.THRESH_BINARY)
    ret2, th2 = cv2.threshold(th1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    blur = cv2.GaussianBlur(th2, (1, 1), 0)
    ret3, th3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    return th3


def remove_noise_and_smooth(file_name):
    img = cv2.imread(file_name, 0)
    filtered = cv2.adaptiveThreshold(img.astype(np.uint8), 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 41, 3)
    kernel = np.ones((1, 1), np.uint8)
    opening = cv2.morphologyEx(filtered, cv2.MORPH_OPEN, kernel)
    closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
    img = image_smoothening(img)
    or_image = cv2.bitwise_or(img, closing)
    return or_image

И результат

Image3

Можете ли вы помочь мне (любая идея) убрать линии на фоне исходного изображения?

4 голоса | спросил S. Hersister 31 J000000Tuesday18 2018, 09:34:38

1 ответ


0
Одним из подходов к достижению этого является вычисление неконтролируемой сегментации изображения с помощью k-средних.Вам просто нужно поиграть со значениями ---- +: = 0 =: + ---- и ---- +: = 1 =: + ----, чтобы получить желаемый результат.Во-первых, вам нужно создать функцию, которая найдет пороговые значения ---- +: = 2 =: + ----. Это просто вычисляет гистограмму изображения, которая используется для вычисления k_means.---- +: = 3 =: + ---- просто преобразует ваш массивный массив в одномерный массив.---- +: = 4 =: + ---- затем преобразует его в двумерный массив, имеющий форму ---- +: = 5 =: + ---- .Далее мы выполняем k_means, как описано здесь .Функция берет входное серое изображение, ваше число ---- +: = 6 =: + ---- интервалов и значение, от которого вы хотите пороговое значение ( ---- +: = 7 =: + ---- ).Возвращает пороговое значение в нужном вам ---- +: = 8 =: + ---- .Выход для этого выглядит так:K-MEANS порогВы можете продолжить с этим методом , с использованием морфологических операторов , или предварительно маскировать изображение с помощью преобразования Хока , как показано в первом ответе здесь .
ответил D.Griffiths 31 J000000Tuesday18 2018, 11:59:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132