Код: Выделить всё
import cv2
import pytesseract
import numpy as np
image_path = "elecBill.jpg"
img = cv2.imread(image_path)
# Resize (VERY IMPORTANT)
img = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Increase contrast using CLAHE
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
gray = clahe.apply(gray)
# Denoise
gray = cv2.bilateralFilter(gray, 9, 75, 75)
# Strong adaptive threshold
thresh = cv2.adaptiveThreshold(
gray,
255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
31,
10
)
# OCR with better config for receipts
custom_config = r'--oem 3 --psm 4'
text = pytesseract.image_to_string(thresh, config=custom_config)
import re
def extract_data(text):
data = {}
clean_text = text.replace('\n', ' ').replace('\r', ' ')
# Extract all dates
dates = re.findall(r'\d{2}[/-]\d{2}[/-]\d{2,4}', clean_text)
if dates:
data["dates_found"] = dates
# Extract all decimal numbers
numbers = re.findall(r'\d+\.\d+', clean_text)
if numbers:
# Convert to float for comparison
float_numbers = [float(n) for n in numbers]
# Largest number often = total payable
largest = max(float_numbers)
data["largest_amount_guess"] = largest
# Keyword based search
keyword_patterns = {
"bill_amount": r'(Bill|Total|Net).{0,20}?(\d+\.\d+)',
"units": r'Units.{0,10}?(\d+)'
}
for key, pattern in keyword_patterns.items():
match = re.search(pattern, clean_text, re.IGNORECASE)
if match:
data[key] = match.group(match.lastindex)
return data
extracted = extract_data(text)
print("\n------ EXTRACTED DATA ------")
print(extracted)
Любая помощь будет полезна. А это мой полный код программы, которую я создал.
Подробнее здесь: https://stackoverflow.com/questions/799 ... -the-image