Extrahierung von Zahlen aus JPG-Dateien und Entfernung von Schattierungen

Fragen zu Tkinter.
Antworten
littleman
User
Beiträge: 5
Registriert: Freitag 10. März 2017, 00:46

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
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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
Antworten