File size: 2,127 Bytes
975f9c6
 
 
 
 
 
 
fcdea18
 
 
2154cf1
 
 
fcdea18
2154cf1
 
 
fcdea18
2154cf1
 
 
 
fcdea18
2154cf1
fcdea18
975f9c6
 
 
2154cf1
975f9c6
2154cf1
 
975f9c6
2154cf1
975f9c6
8ccdb60
 
975f9c6
2154cf1
 
 
8ccdb60
2154cf1
 
 
 
 
 
 
975f9c6
2154cf1
8ccdb60
2154cf1
8ccdb60
975f9c6
8ccdb60
385a153
975f9c6
2154cf1
975f9c6
 
 
 
 
 
 
385a153
975f9c6
 
385a153
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
import easyocr
import numpy as np
import cv2
import re

reader = easyocr.Reader(['en'], gpu=False)

def enhance_image(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # CLAHE (adaptive histogram equalization for better contrast)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    contrast = clahe.apply(gray)

    # Sharpen image
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
    sharpened = cv2.filter2D(contrast, -1, kernel)

    # Resize if very small
    h, w = sharpened.shape
    if max(h, w) < 500:
        sharpened = cv2.resize(sharpened, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

    return sharpened

def extract_weight_from_image(pil_img):
    try:
        img = np.array(pil_img)
        img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # convert from PIL to OpenCV BGR

        # Preprocess image
        processed = enhance_image(img)

        results = reader.readtext(processed)

        best_weight = None
        best_conf = 0.0

        for (bbox, text, conf) in results:
            original_text = text
            text = text.lower().strip()

            # Fix common OCR errors
            text = text.replace(",", ".")
            text = text.replace("o", "0").replace("O", "0")
            text = text.replace("s", "5").replace("S", "5")
            text = text.replace("g", "9").replace("G", "6")
            text = text.replace("kgs", "").replace("kg", "")
            text = re.sub(r"[^\d\.]", "", text)

            if re.fullmatch(r"\d{1,4}(\.\d{1,3})?", text):
                if conf > best_conf:
                    best_weight = text
                    best_conf = conf

        if not best_weight:
            return "Not detected", 0.0

        # Format output
        if "." in best_weight:
            int_part, dec_part = best_weight.split(".")
            int_part = int_part.lstrip("0") or "0"
            best_weight = f"{int_part}.{dec_part}"
        else:
            best_weight = best_weight.lstrip("0") or "0"

        return best_weight, round(best_conf * 100, 2)

    except Exception as e:
        return f"Error: {str(e)}", 0.0