Seite 1 von 1

Extrahierung von Zahlen aus JPG-Dateien und Entfernung von Schattierungen

Verfasst: Mittwoch 12. Juli 2023, 12:45
von littleman
Ich habe hier ein Beispiel und komme nicht weiter. Ich möchte eine JPG-Datei einlesen und die Zahl darin heraussuchen. Ich möchte die Schattierungen entfernen und nur die Konturen in der Mitte übernehmen. Gibt es eine Möglichkeit, wie ich das am besten umsetzen kann?

Anbei mein Code:

Code: Alles auswählen

import cv2
import pytesseract
import numpy as np

# Path to the marked file
marking_path = "markierung_4.jpg"

# Method for preprocessing the image
def preprocess_image(image):
    # Convert the image to grayscale
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # Apply adaptive thresholding
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)

    # Use morphological operations to improve the contours
    kernel = np.ones((3, 3), np.uint8)
    eroded = cv2.erode(thresh, kernel, iterations=1)
    dilated = cv2.dilate(eroded, kernel, iterations=1)

    # Display the preprocessing steps as images
    cv2.imshow("Original Image", image)
    cv2.imshow("Grayscale", gray)
    cv2.imshow("Threshold", thresh)
    cv2.imshow("Preprocessed Image", dilated)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    return dilated

# Method for number recognition using Tesseract
def recognize_numbers(image):
    recognized_text = pytesseract.image_to_string(image, config='--psm 10 --oem 3')
    return recognized_text

# Load the marked image
marked_image = cv2.imread(marking_path)

if marked_image is not None:
    # Preprocess the image
    preprocessed_image = preprocess_image(marked_image)

    # Recognize numbers using Tesseract
    recognized_number = recognize_numbers(preprocessed_image)

    print("Recognized Number:", recognized_number)
else:
    print(f"Error loading the image {marking_path}")
Ausgabe ist:
Recognized Number: 4)

Ergebnis:
https://ibb.co/37RDZrh
Originalfoto:
https://ibb.co/g3FhxRn

Re: Extrahierung von Zahlen aus JPG-Dateien und Entfernung von Schattierungen

Verfasst: Mittwoch 12. Juli 2023, 18:03
von __deets__
Ausnahmsweise mal jemand, der bei einem CV Problem Bilder mitliefert - ich bin aufrichtig entzückt.

Ich sehe da diverse Eingriffsmöglichkeiten:

- dein Bild ist ziemlich klein. Der adaptive threshold Bereich dafür ziemlich groß. Daran kannst du Schrauben.
- Der rote Rahmen ist irritierend und verschlechtert das Bild. Woher kommt der & kann der Weg? Zur Not einfach auch nochmal vorher croppen.
- da der Schatten systematisch vorhanden ist, kann er ggf. durch eine feste Maske dauerhaft aufgehellt werden.
- statt Tesseract einen eigenen SVM basierten Klassifikatir Bauen, der die artefakte einfach mit lernt.
- statt “klassischer” Methoden mit CNNs arbeiten, die können besser mit solchen Daten umgehen.
- Umstände verändern: mit besserer Beleuchtung verschwindet der Schatten. Setzt natürlich Einfluss auf den Gewinn dieser Daten voraus.

Das war erstmal was mir so einfällt.

Re: Extrahierung von Zahlen aus JPG-Dateien und Entfernung von Schattierungen

Verfasst: Donnerstag 13. Juli 2023, 08:34
von ThomasL
Wenn alle Ziffern von 0 bis 9 in dieser Qualität vorliegen, reicht da ein kleines CNN aus, so wie bei dem Machine Learnig "Hello World!" MNIST , und ich "garantiere" 100% Erkennung.

Schau dir mal diese Anleitungen/Kurse an:

https://machinelearningmastery.com/how- ... ification/

https://github.com/numpy/numpy-tutorial ... n-mnist.md

https://www.udacity.com/course/intro-to ... ing--ud187

Re: Extrahierung von Zahlen aus JPG-Dateien und Entfernung von Schattierungen

Verfasst: Donnerstag 13. Juli 2023, 09:55
von Sirius3
In Deinem Fall ist das Problem ganz einfach: Du hast einen dunklen Bereich am Rand und einen in der Mitte. Was Du willst, ist Rand und Mitte zu trennen.
Hier probiere ich einfach verschiedene Schwellwerte aus, und nehme den, wo die Mitte gerade noch so vom Rand unterscheidbar ist.

Code: Alles auswählen

threshold = max(range(0, 256, 10), key=lambda k: (scipy.ndimage.label(gray<k)[0]==2).sum())
img = scipy.ndimage.label(gray < threshold)[0]==2