Spaces:
Running
Running
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
|