Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from numpy import zeros, squeeze
- from skimage.morphology import disk
- from skimage.io import imread, imsave
- from skimage.exposure import adjust_log, adjust_gamma, equalize_hist
- from skimage.filters import denoise_bilateral, threshold_otsu, threshold_adaptive,gaussian_filter, median, rank,inverse
- from scipy import ndimage
- from math import gamma
- from sklearn import svm, datasets, feature_extraction
- from skimage.segmentation import felzenszwalb, clear_border
- from skimage import morphology
- import matplotlib
- import matplotlib.pyplot as plt
- from itertools import permutations
- from skimage.transform import resize
- from skimage import data
- from skimage.filters import rank
- from skimage.util import img_as_ubyte, img_as_float
- from skimage.feature import hog
- from os import listdir
- def filtering(image):
- image = denoise_bilateral(rank.autolevel(image, disk(5)))
- black_white = threshold_otsu(image)
- for i in range(len(image)):
- for j in range(len(image[1])):
- if image[i][j] >= black_white:
- image[i][j] = 1
- else:
- image[i][j] = 0
- return image
- def generate_template(digit_dir_path):
- ans=[]
- for name in listdir(digit_dir_path):
- img = imread(digit_dir_path + "/" + name)
- img = resize(img, (25, 15))
- img = img.ravel()
- ans.append(img)
- return ans
- def recognize(image, digit_templates):
- image = filtering(image)
- image = image >= rank.otsu(image, disk(20))
- image = image == False
- image = clear_border(image)
- morphology.remove_small_objects(image, min_size=60, connectivity=1, in_place=True)
- marked, objects = ndimage.label(image)
- founded_obj =[]
- for obj in range(objects):
- temp = ndimage.find_objects(marked)[obj]
- founded_obj.append((marked[temp], temp))
- for numb in permutations(founded_obj, 3):
- calibrate_numbers = numb[0][1][1].start < numb[1][1][1].start < numb[2][1][1].start
- calibrate_height = abs(len(numb[0][0]) - len(numb[1][0])) < 5 and abs(len(numb[1][0]) - len(numb[2][0])) < 5 and abs(len(numb[0][0]) - len(numb[2][0])) < 5
- calibrate_width = abs(len(numb[0][0][0]) - len(numb[1][0][0])) < 5 and abs(len(numb[1][0][0]) - len(numb[2][0][0])) < 5 and abs(len(numb[0][0][0]) - len(numb[2][0][0])) < 5
- if calibrate_numbers == True and calibrate_width == True and calibrate_height == True:
- numbers = numb
- break
- image = img_as_ubyte(image)
- dataset = []
- for i in range(0, 10):
- for number in digit_templates:
- dataset.append([i, number])
- goal = [array[0] for array in dataset]
- attemt = [array[1] for array in dataset]
- kek = svm.SVC(kernel = "poly", degree = 2)
- kek.fit(attemt, goal)
- try:
- one = img_as_ubyte(numbers[0][0] == 0)
- two = img_as_ubyte(numbers[1][0] == 0)
- three = img_as_ubyte(numbers[2][0] == 0)
- except:
- return -1
- predict1 = kek.predict(resize(one, (25,15)).ravel())[0]
- predict2 = kek.predict(resize(two, (25,15)).ravel())[0]
- predict3 = kek.predict(resize(three, (25,15)).ravel())[0]
- return predict1, predict2, predict3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement