diff --git a/main.py b/main.py index 85cde4f..cd28954 100644 --- a/main.py +++ b/main.py @@ -1,18 +1,20 @@ import glob import os -from src.processing.loader import load_image, save_image -from src.processing.linefinder import find_lines, preparation +from src.processing.loader import load_image +from src.processing.linefinder import find_lines from matplotlib import pyplot as plt from src.processing.receiptcutter import cut_receipt for root, dirs, files in os.walk("data"): for file in files: - if file.startswith("receipt-08"): + if file.startswith("receipt-12"): image = load_image("data/"+file) receipt = cut_receipt(image, draw_steps=True) - lines = find_lines(receipt) + lines = find_lines(receipt, draw_steps=True) + print("hh", len(lines)) + #continue for line in lines: plt.imshow(line, cmap="gray") plt.show() diff --git a/src/processing/linefinder.py b/src/processing/linefinder.py index f1e1ea0..6123cb2 100644 --- a/src/processing/linefinder.py +++ b/src/processing/linefinder.py @@ -3,8 +3,12 @@ from scipy.ndimage import measurements from src.processing.imageprocessing import rgb2gray +from matplotlib import pyplot as plt -def find_lines(image): +from src.utils.cmap_generator import rand_cmap + + +def find_lines(image, draw_steps=False): gray, binary, magnitude = preparation(image) #backtrack = load_numpy("result/backtrack.npz") #if backtrack is None: @@ -12,7 +16,7 @@ def find_lines(image): #save_numpy("result/backtrack.npz", backtrack) seams = calculate_seams(backtrack) labeled, ncomponents = group_empty_boxes(seams) - lines = generate_lines(labeled, ncomponents, gray) + lines = generate_lines(labeled, ncomponents, gray, draw_steps) return filter_lines(lines) @@ -102,9 +106,14 @@ def group_empty_boxes(seams): return labeled, ncomponents -def generate_lines(labeled, ncomponents, gray): +def generate_lines(labeled, ncomponents, gray, draw_steps=False): + if draw_steps: + plt.imshow(labeled, cmap=rand_cmap(ncomponents+1, "hard")) + plt.title("Found line groups") + plt.show() + groups = np.copy(labeled) - group_id = 1 + group_id = 0 entries = [] pixelgroup = None in_top_mode = True @@ -113,11 +122,12 @@ def generate_lines(labeled, ncomponents, gray): def submit_entry(): nonlocal pixelgroup, group_id, entries + group_id += 1 minps = np.min(pixelgroup, axis=0) maxps = np.max(pixelgroup, axis=0) - if pixel.shape[0] < 20 or maxps[1] - minps[1] < 5 or maxps[0] - minps[0] < 5: - return entry = gray[minps[1]:maxps[1] + 1, minps[0]:maxps[0] + 1] + if pixelgroup.shape[0] < 20 or maxps[1] - minps[1] < 5 or maxps[0] - minps[0] < 5: + return if pixelgroup.shape[0] / entry.shape[0] / entry.shape[1] < 0.10: return pixelgroup = np.subtract(pixelgroup, minps) @@ -131,7 +141,6 @@ def generate_lines(labeled, ncomponents, gray): #white[pixelgroup[:, 1], pixelgroup[:, 0]] = entry[pixelgroup[:, 1], pixelgroup[:, 0]] entries.append(white) pixelgroup = None - group_id += 1 for label in range(1, ncomponents+1): pixel = indices[labeled == label] @@ -149,21 +158,30 @@ def generate_lines(labeled, ncomponents, gray): in_top_mode = False if pixelgroup is not None and minp[1] - 5 > np.max(pixelgroup, axis=0)[1]: submit_entry() - groups[labeled == label] = group_id + groups[labeled == label] = group_id+1 if pixelgroup is None: pixelgroup = pixel[:, :] else: pixelgroup = np.concatenate((pixelgroup, pixel)) submit_entry() + if draw_steps: + plt.imshow(groups, cmap=rand_cmap(group_id+1, "hard")) + plt.title("Combined and valid groups") + plt.show() return entries def filter_lines(lines): filtered = [] for line in lines: cnt, vals = np.histogram(line, 256) - threshold = get_threshold(cnt)/256*1.13#*0.96 + threshold = get_threshold(cnt)/256*0.96 binary = (line > threshold).astype(np.int_) labeled, ncomponents = group_empty_boxes(binary) - if ncomponents > 2: + count = 0 + for label in range(1, ncomponents+1): + pixcnt = np.sum(labeled == label) + if pixcnt > 10: + count += 1 + if count > 2: filtered.append(line) return filtered \ No newline at end of file diff --git a/src/processing/receiptcutter.py b/src/processing/receiptcutter.py index 4c6935a..c118248 100644 --- a/src/processing/receiptcutter.py +++ b/src/processing/receiptcutter.py @@ -3,6 +3,8 @@ from collections import defaultdict from skimage.transform import resize from scipy.ndimage import gaussian_filter +from matplotlib import pyplot as plt + from src.processing.imageprocessing import rgb2gray_value from scipy import signal import numpy as np @@ -161,8 +163,8 @@ def draw_hough_lines(image, scale, results, references, shape, theta_res=5, widt y = int(n - x * m) if 0 < y < image.shape[0]: draw_image[max(0, y - GREEN_WIDTH):y + GREEN_WIDTH, max(0, x - GREEN_WIDTH):x + GREEN_WIDTH] = np.array([255, 0, 0]) - #plt.imshow(draw_image) - #plt.show() + plt.imshow(draw_image) + plt.show() def convert_to_lines(scale, results, references, shape, theta_res=5, width_res=5): @@ -342,8 +344,8 @@ def draw_rectangle(image, corners): x = int(a[1] + (b[1] - a[1]) * i / 5000) y = int(a[0] + (b[0] - a[0]) * i / 5000) draw_image[max(0, y - 15):y + 10, max(0, x - 10):x + 10] = np.array([255, 0, 0]) - #plt.imshow(draw_image) - #plt.show() + plt.imshow(draw_image) + plt.show() def crop_image(image, corners):