From 88f48afd07569a3553da1f63eb53f44bb3a4fd78 Mon Sep 17 00:00:00 2001 From: theAlexGuy Date: Tue, 11 Feb 2020 02:49:20 +0100 Subject: [PATCH] Refactoring; Renamed to constants --- .idea/misc.xml | 2 +- .idea/receipt-recognition.iml | 6 +- resources/fonts/Merchant Copy.ttf | Bin 0 -> 120304 bytes src/ImageGenerator.py | 188 ++++++++++------------- src/{MyImageHelper.py => ImageHelper.py} | 0 5 files changed, 85 insertions(+), 111 deletions(-) create mode 100644 resources/fonts/Merchant Copy.ttf rename src/{MyImageHelper.py => ImageHelper.py} (100%) diff --git a/.idea/misc.xml b/.idea/misc.xml index f946d59..be60604 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/.idea/receipt-recognition.iml b/.idea/receipt-recognition.iml index e890d94..361554c 100644 --- a/.idea/receipt-recognition.iml +++ b/.idea/receipt-recognition.iml @@ -2,12 +2,10 @@ + - + - - \ No newline at end of file diff --git a/resources/fonts/Merchant Copy.ttf b/resources/fonts/Merchant Copy.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a0952721028b77e7bc6e08fd94e87c2968b9081d GIT binary patch literal 120304 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/<9BKn5G)jm7r#3|tR?7LQ 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 PJQ+Ir)f)zn;;Z{lLJqFf literal 0 HcmV?d00001 diff --git a/src/ImageGenerator.py b/src/ImageGenerator.py index c5e4ec3..fbd8191 100644 --- a/src/ImageGenerator.py +++ b/src/ImageGenerator.py @@ -1,21 +1,3 @@ -#from IPython.core.completer import back_latex_name_matches -#from PIL import Image, ImageDraw, ImageFont -# get an image -#base = Image.open('Pillow/Tests/images/hopper.png').convert('RGBA') - -# make a blank image for the text, initialized to transparent text color -#img = Image.new('RGB', (30, 30), (255,255,255)) -# -# # get a font -# fnt = ImageFont.truetype('resources\HelveticaNeueLight.ttf', 40) -# # get a drawing context -# d = ImageDraw.Draw(img) -# -# -# # draw text -# d.text((0,0), "T", font=fnt, fill=(0,0,0)) -# text_width, text_height = d.textsize('T') -# print("width {:d} - height {:d}".format(text_width, text_height)) # ------------------------------ Generate Characters ----------------------------# # Import python imaging libs @@ -27,13 +9,72 @@ from PIL import ImageFont, ImageFilter import numpy as np # Import operating system lib import os, errno - +from ImageHelper import noisy # Import random generator from random import randint import shutil import csv import pickle +#---------------------------------- Input and Output ---------------------------# +# Directory containing fonts +font_dir = '../resources/fonts' + +# Output +out_dir = '../results/' + +k = 0 + +# ------------------------------------ Characters -------------------------------# +# Numbers +NUMBERS = ['0', '1', '2'] + +# Small letters +SMALL_LETTERS = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] +SMALL_LETTERS_SAMPLE = ['k', 'b', 'c', 'e'] +CAPITAL_LETTERS = [x.capitalize() for x in SMALL_LETTERS] +CAPITAL_LETTERS_SAMPLE = [x.capitalize() for x in SMALL_LETTERS_SAMPLE] + +# Capital letters +#capital_letters = ["A", 'B', 'C'] + +# Select characters +CHARACTERS = SMALL_LETTERS +CHARACTERS_SAMPLE = SMALL_LETTERS_SAMPLE +#------------------------------------- Colors ----------------------------------# + +# Background color +COLORS_WHITE = [(255, 255, 255)] +COLORS_WHITE_SAMPLE = COLORS_WHITE +COLORS_BLACK = (0, 10, 20, 30) +COLORS_GRAY = [(135, 145, 155)] + +#background_colors = white_colors +COLORS_BACKGRND_CHOSEN = COLORS_WHITE_SAMPLE + +# -------------------------------------- Sizes ----------------------------------# + +# Character sizes +FONTSIZE_SMALL = (10, 14, 16) +FONTSIZE_MEDIUM = (20, 24, 28) +FONTSIZE_LARGE = (30, 36, 40) +FONTSIZE_LARGE_SAMPLE = (24, 30) + +FONTSIZE_CHOSEN = FONTSIZE_LARGE_SAMPLE + +# Image size +IMAGE_SIZE = 32 + +OFFSET_X = [-0.3, -0.1, 0, 0.1, 0.3] +OFFSET_Y = [-0.3, -0.1, 0, 0.1, 0.3] +OFFSET_X_SAMPLE = [-0.1, 0, 0.1] +OFFSET_Y_SAMPLE = [-0.3, -0.1, 0, 0.1, 0.3] + + + +# -------------------------------------- rotation and offset ----------------------------------# +ROTATION = [-0.1, -0.5, 0, 0.5, 0.1] +ROTATION_SAMPLE = [0] # ------------------------------------ Cleanup ----------------------------------# @@ -53,10 +94,10 @@ def cleanup(): def generateCharacters(mode ='image', sample = True): if(mode == 'image'): - myoffsetsX = offsetsX_sample if sample else offsetsX - myoffsetsY = offsetsY_sample if sample else offsetsY - mydegrees = degrees_sample if sample else degrees - mycharacters = characters_sample if sample else characters + myoffsetsX = OFFSET_X_SAMPLE if sample else OFFSET_X + myoffsetsY = OFFSET_Y_SAMPLE if sample else OFFSET_Y + mydegrees = ROTATION_SAMPLE if sample else ROTATION + mycharacters = CHARACTERS_SAMPLE if sample else CHARACTERS cleanup() # Counter k = 1 @@ -69,10 +110,10 @@ def generateCharacters(mode ='image', sample = True): # For each character do for char in mycharacters: # For each font size do - for font_size in font_sizes: + for font_size in FONTSIZE_CHOSEN: if font_size > 0: # For each background color do - for background_color in background_colors: + for background_color in COLORS_BACKGRND_CHOSEN: for offsetx in myoffsetsX: for offsety in myoffsetsY: for degree in mydegrees: @@ -81,7 +122,7 @@ def generateCharacters(mode ='image', sample = True): "font size: {}\t" "degree: {}\t \t" "offsetX: {}\t" - "offsetY: {}".format(image_size, char, font_size, degree,offsetx, offsety)) + "offsetY: {}".format(IMAGE_SIZE, char, font_size, degree, offsetx, offsety)) try: dir = out_dir+char+'/' @@ -98,25 +139,25 @@ def generateCharacters(mode ='image', sample = True): GenerateCSVData(sample) def GenerateCSVData(sample = True): - myoffsetsX = offsetsX_sample if sample else offsetsX - myoffsetsY = offsetsY_sample if sample else offsetsY - mydegrees = degrees_sample if sample else degrees - mycharacters = characters_sample if sample else characters + myoffsetsX = OFFSET_X_SAMPLE if sample else OFFSET_X + myoffsetsY = OFFSET_Y_SAMPLE if sample else OFFSET_Y + mydegrees = ROTATION_SAMPLE if sample else ROTATION + mycharacters = CHARACTERS_SAMPLE if sample else CHARACTERS print("image size: {} \t " "characters: {}\t" "backgrounds: {}\t" "font sizes: {}\t" "degree: {}\t" "offsetX: {}\t" - "offsetY: {}".format(image_size, mycharacters, background_colors, font_sizes, mydegrees,myoffsetsX, myoffsetsY)) + "offsetY: {}".format(IMAGE_SIZE, mycharacters, COLORS_BACKGRND_CHOSEN, FONTSIZE_CHOSEN, mydegrees, myoffsetsX, myoffsetsY)) k = 0 i = 0 path, dirs, files = next(os.walk(font_dir)) file_count = len(files) - height = file_count*len(mycharacters)*len(font_sizes)*len(background_colors)*len(myoffsetsX)*len(myoffsetsY)*len(mydegrees)*3 + height = file_count * len(mycharacters) * len(FONTSIZE_CHOSEN) * len(COLORS_BACKGRND_CHOSEN) * len(myoffsetsX) * len(myoffsetsY) * len(mydegrees) * 3 print(height) - width = image_size*image_size+1 + width = IMAGE_SIZE * IMAGE_SIZE + 1 output = np.ones((height,width), dtype=object) mapDic = {} for dirname, dirnames, filenames in os.walk(font_dir): @@ -129,10 +170,10 @@ def GenerateCSVData(sample = True): for char in mycharacters: mapDic[char] = i # For each font size do - for font_size in font_sizes: + for font_size in FONTSIZE_CHOSEN: if font_size > 0: # For each background color do - for background_color in background_colors: + for background_color in COLORS_BACKGRND_CHOSEN: for offsetx in myoffsetsX: for offsety in myoffsetsY: for degree in mydegrees: @@ -195,7 +236,7 @@ def getMapDic(): def createImageTemplate(background_color, char, font_size, k, font_filename, degree = 0, offsetX = 0, offsetY = 0, noise = 0): # Create character image : # Grayscale, image size, background color - char_image = Image.new('RGBA', (image_size, image_size), \ + char_image = Image.new('RGBA', (IMAGE_SIZE, IMAGE_SIZE), \ background_color) # Draw character image draw = ImageDraw.Draw(char_image) @@ -205,9 +246,9 @@ def createImageTemplate(background_color, char, font_size, k, font_filename, deg # Get character width and height (font_width, font_height) = font.getsize(char) # Calculate x position - x = (image_size - font_width) / 2 + offsetX*image_size + x = (IMAGE_SIZE - font_width) / 2 + offsetX * IMAGE_SIZE # Calculate y position - y = (image_size - font_height) / 2 + offsetY*image_size + y = (IMAGE_SIZE - font_height) / 2 + offsetY * IMAGE_SIZE # Draw text : Position, String, # Options = Fill color, Font draw.text((x, y), char,(0,0,0), font=font) @@ -216,11 +257,6 @@ def createImageTemplate(background_color, char, font_size, k, font_filename, deg # Final file name file_name = "{}_f_{}_fs_{}_bc_{}_n_{}_r_{}_ox_{}_oy_{}_{}.png".\ format(char,fontname, font_size,background_color,noise,degree,offsetX,offsetY,k) - #str(font_size) + '_bc_' + \ - # str(background_color) + '_r_' + \ - # str(background_color) + '_r_' + \ - # str(background_color) + '_r_' + \ - # str(k) + '.png' # Save image #char_image.save('results/' + file_name) @@ -229,7 +265,7 @@ def createImageTemplate(background_color, char, font_size, k, font_filename, deg def createImage(directory, background_color, char, font_size, k, font_filename, degree = 0, offsetX = 0, offsetY = 0, noise = 0, save = True): blankImage, file_name = createBlankImage() - blankImage.save('blankIamge.png') + #blankImage.save('blankImage.png') image2, file_name2 = createImageTemplate(background_color, char, font_size, k, font_filename, degree, offsetX, offsetY, noise) #image2.save('./results/'+str(k)+'.png') px, py = 0, 0 @@ -263,79 +299,19 @@ def addNoise(image, noise = 0): def createBlankImage(): # Create character image : # Grayscale, image size, background color - char_image = Image.new('RGBA', (image_size, image_size), \ + char_image = Image.new('RGBA', (IMAGE_SIZE, IMAGE_SIZE), \ (255,255,255)) # w = char_image.rotate(45.5, expand=1) #char_image.rotate(45).show() # Final file name - file_name = 'blankoImage {}x{}.png'.format(image_size, image_size) + file_name = 'blankoImage {}x{}.png'.format(IMAGE_SIZE, IMAGE_SIZE) #print(file_name) # Save image #char_image.save('results/' + file_name) return (char_image, file_name) -#---------------------------------- Input and Output ---------------------------# - -# Directory containing fonts -font_dir = './resources/fonts' - -# Output -out_dir = './results/' - -k = 0 - -# ------------------------------------ Characters -------------------------------# -# Numbers -numbers = ['0', '1', '2'] - -# Small letters -small_letters = ['a', 'b', 'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] -small_letters_limited = ['k', 'b', 'c','e'] -capital_letters = [x.capitalize() for x in small_letters_limited] -#print(big_letters) -# Capital letters -#capital_letters = ["A", 'B', 'C'] - -# Select characters -characters = small_letters -characters_sample = small_letters_limited -#------------------------------------- Colors ----------------------------------# - -# Background color -white_colors = [(255,255,255),(220,220,220)] -white_colors_sample = [(255,255,255)] -black_colors = (0, 10, 20, 30) -gray_colors = [(135, 145, 155)] - -#background_colors = white_colors -background_colors = white_colors_sample - -# -------------------------------------- Sizes ----------------------------------# - -# Character sizes -small_sizes = (10, 14, 16) -medium_sizes = (20, 24, 28) -medium_sizes = (20, 24, 28) -large_sizes = (30,36,40) -large_sizes_sample = (24,30) - -font_sizes = large_sizes_sample - -# Image size -image_size = 32 - -offsetsX = [-0.3,-0.1,0,0.1,0.3] -offsetsY = [-0.3,-0.1,0,0.1,0.3] -degrees = [-0.1,-0.5,0,0.5,0.1] -offsetsX_sample = [-0.1,0,0.1] -offsetsY_sample = [-0.3,-0.1,0,0.1,0.3] -degrees_sample = [-0.1,-0.5,0,0.5,0.1] - - -# -------------------------------------- rotation and offset ----------------------------------# - diff --git a/src/MyImageHelper.py b/src/ImageHelper.py similarity index 100% rename from src/MyImageHelper.py rename to src/ImageHelper.py