-
Notifications
You must be signed in to change notification settings - Fork 1
/
phone_img_parser.py
105 lines (69 loc) · 3.42 KB
/
phone_img_parser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'ipetrash'
from PIL import Image
import glob
BLACK_PXL = 0
def get_margins(im):
"""Функция для определения границ номера сотового"""
w, h = im.size
left, right, top, bottom = w, -1, h, -1
for y in range(h):
for x in range(w):
pxl = im.getpixel((x, y))
if pxl == BLACK_PXL:
if left > x:
left = x
if right < x:
right = x
if top > y:
top = y
if bottom < y:
bottom = y
return left, right, top, bottom
def crop_im_phone(im):
"""Функция вырезает из изображения номер сотового и возвращает его копию"""
left, right, top, bottom = get_margins(im)
return im.crop((left, top, right+1, bottom+1))
NUMBERS_DIR = 'numbers'
class PhoneImgParser:
"""Класс для разбора изображения номера телефона."""
def __init__(self):
self.num_img_list = dict()
num_file_list = glob.glob("{}/*.png".format(NUMBERS_DIR))
num_file_list = sorted(num_file_list)
# От 0 до 9 может быть
if len(num_file_list) != 10:
raise Exception('Файлов изображений в папке "{}" может быть только 10 -- для '
'каждой цифры свой файл. Найдено же {}.'.format(NUMBERS_DIR, len(num_file_list)))
for i, path in enumerate(num_file_list):
num_im = Image.open(path).convert('L')
self.num_img_list[i] = num_im
def parse_from_file(self, file):
"""Функция принимает в путь к файлу изображения телефона, парсит и возвращает строку с номером телефона
"""
ph_im = Image.open(file).convert('L')
ph_im = crop_im_phone(ph_im)
ph_w, ph_h = ph_im.size
phone_number = ""
# Перебираем каждый x картинки с телефоном
for offset in range(ph_w + 1):
# На каждом шагу x проверяем на совпадение с изображением цифры
for num, im_num in self.num_img_list.items():
num_w, num_h = im_num.size
# Проверяем границы -- в какой-то момент картинки цифр будут выходить из за границы
if offset + num_w > ph_w:
continue
find = True
# По пиксельно проверяем текущую область картинки сотового на совпадение с цифрой
for x in range(num_w):
for y in range(num_h):
ph_pxl = ph_im.getpixel((x + offset, y))
num_pxl = im_num.getpixel((x, y))
if ph_pxl != num_pxl:
find = False
break
# Если нашли, добавляем цифру в строку с телефоном
if find:
phone_number += str(num)
return phone_number