Projektaufbau – Entrasterungs-KI
Worum geht es in dem Projekt?
In diesem Projekt wird ein Denoising Convolutional Neural Network (DnCNN) in MATLAB implementiert, das zur Entfernung von Druckrastern eingesetzt wird. Anders als beim klassischen DnCNN-Ansatz wird kein Residual Learning verwendet. Stattdessen kommt ein Direct-Mapping-Ansatz zum Einsatz. Das Netzwerk wird direkt darauf trainiert, ein Bild, das durch ein amplitudenmoduliertes Raster (AM-Raster) geprägt ist, in ein sauberes, rasterfreies Bild zu überführen.
Damit dieser Ansatz funktioniert, müssen mehrere vorbereitende Schritte durchgeführt werden. Obwohl die KI die Transformation grundsätzlich kanonisch und bijektiv umsetzt (AM-Bild → normales Bild), ist ein Preprocessing erforderlich. Eine vollständig in die KI integrierte Lösung konnte bisher nicht gefunden werden, trotz intensiver Bemühungen.
Was ich damit genau meine, wird im weiteren Verlauf des Artikels noch ausführlich erläutert.
Technische Vorraussetzungen
Folgender Befehl in der Kommandozeile gibt immer alle Notwendigen Toolboxen zurück.
[files, products] = matlab.codetools.requiredFilesAndProducts("Datei.mlx")
Stand 06.01.2026 sollten folgende Toolboxen installiert werden:
- Deep Learning Toolbox
- Image Processing Toolbox
- Parallel Computing Toolbox
- System Identification Toolbox
- Signal Processing Toolbox
Des weiteren sind Folgende Dateien wichtig und im SVN hochgeladen:
- Training.mlx
- Training_fortsetzen.mlx
- PatchDatastore.m
- combinedLoss.mlx
- Druckmuster_erstellen_function.mlx
- SynthetischeBilderErzeugen.mlx
- KI_Test_Fertig.mlx
Exemplarische Durchführung
KI Erzeugen
Training.mlx
Dieses MATLAB-Live-Script steuert den technischen Ablauf zum Trainieren des neuronalen Netzwerks. Zu Beginn wird die Arbeitsumgebung vorbereitet, die GPU-Unterstützung via CUDA initialisiert und die Ordnerstruktur für Patches und Checkpoints angelegt. Das Skript übernimmt die automatisierte Zerlegung der Quellbilder in Graustufen-Patches der Größe 256x256 Pixel, die anschließend über einen imageDatastore verwaltet und in einen Trainings- sowie einen Validierungsdatensatz (80/20-Split) unterteilt werden.
Im weiteren Verlauf wird das dnCNN definiert, wobei das Training über den SGDM-Optimierer mit einer adaptiven Lernrate erfolgt. Das Skript nutzt die Klasse PatchDatastore, um den Bildern während des Prozesses dynamisch die synthetischen Raster beizufügen. Während der Ausführung überwacht das Skript die Validierungskriterien auf Basis der combinedLoss-Funktion, sichert regelmäßige Checkpoints und exportiert das fertig trainierte Modell nach Erreichen der Abbruchkriterien als .mat-Datei.
PatchDatastore.m
Diese Klasse definiert einen spezialisierten Datenspeicher, der die Schnittstellen für Mini-Batches, Shuffling und Partitionierung in MATLAB implementiert. Die Hauptaufgabe des Datastores liegt in der dynamischen Generierung von Trainingsdaten während der Laufzeit. Anstatt statische Paare von gerasterten und sauberen Bildern zu laden, liest die Klasse saubere Originalbilder ein und transformiert diese „on-the-fly“ mithilfe der Funktion Druckmuster_erstellen_function. Dabei werden für jeden Batch zufällige Parameter wie Rasterzellengröße, Skalierungsfaktoren und Radien angewendet, um eine hohe Varianz im Training zu erzielen, ohne den Festplattenspeicher durch vorberechnete Dateien zu belasten.
Technisch extrahiert der Datastore pro Bild eine definierte Anzahl an zufälligen Ausschnitten (Patches). Er stellt sicher, dass die Eingabedaten (Input) und die Zielbilder (Response) geometrisch exakt aufeinander abgestimmt sind, indem das saubere Originalbild mittels bikubischer Interpolation an die Größe des erzeugten Druckmusters angepasst wird. Durch die Implementierung der Methoden shuffle und partition ermöglicht die Klasse eine effiziente Durchmischung der Bildquellen sowie eine saubere Trennung von Trainings- und Validierungsdaten innerhalb der Deep-Learning-Pipeline.
combinedLoss.mlx
Diese Funktion definiert ein kombiniertes Fehlermaß (Loss Function), das während des Trainings zur Bewertung der Bildrekonstruktion herangezogen wird. Um eine hohe visuelle Güte der rasterfreien Bilder zu erreichen, gewichtet die Funktion drei verschiedene mathematische Ansätze. Der Mean Squared Error (MSE) sorgt für die grundlegende Übereinstimmung der Pixelwerte und der Helligkeit. Zur Erhaltung der Bildstrukturen wird der Structural Similarity Index (SSIM) integriert, der die menschliche Wahrnehmung von Kontrasten und Texturen besser abbildet als ein rein pixelbasierter Vergleich.
Besonderes Augenmerk liegt auf dem Edge Loss, der durch die Berechnung von Gradienten in horizontaler und vertikaler Richtung die Schärfe der Kanten im rekonstruierten Bild sicherstellt und so einem möglichen Verschwimmen entgegenwirkt. Die Komponenten sind dabei so gewichtet, dass der Fokus primär auf der Struktur (50 %) und der Kantenschärfe (40 %) liegt, während die reine Pixelgenauigkeit (10 %) unterstützend wirkt. Zudem enthält die Funktion eine Sicherheitsprüfung gegen numerische Instabilitäten (NaN-Werte), um einen stabilen Trainingsverlauf zu gewährleisten.
Druckmuster_erstellen_function
Die Erzeugung der synthetischen Trainingsdaten erfolgte über eine dreistufige Optimierung der Punktgeometrie, um die KI schrittweise an reale Bedingungen heranzuführen:
Ansatz 1: Orthogonale Basis-Rasterung
Implementierung einer starren Gitterstruktur mit festen Koordinaten.
Direkte Kopplung zwischen lokalem Grauwert und dem Radius der kreisförmigen Druckpunkte.
Dient als theoretisches Fundament zur Abbildung der Helligkeitslogik.
Ansatz 2: Versetzte Punkt-Layouts
Einführung eines Zeilenversatzes zur Nachbildung industrieller Druckstandards (Halbraster).
Integration variabler Skalierungseffekte zur Simulation unterschiedlicher Druckauflösungen.
Erhöhung der Komplexität durch Abkehr von rein quadratischen Anordnungen.
Ansatz 3: Stochastische Positionierung (Jitter)
Integration von zufälligen Abweichungen bei der Platzierung der Rasterpunkte.
Nachstellung physikalischer Ungenauigkeiten wie mechanischem Spiel oder Materialunregelmäßigkeiten.
Ziel ist die Generalisierung der KI auf unsaubere Scans und deformierte Punktstrukturen.
KI Anwenden
Zunächst muss aus einem beliebigen Bild ein synthetisches Bild erzeugt werden, das die Eigenschaften eines Druckrasters aufweist. Alternativ kann man auch ein Bild verwenden, das bereits ein Druckraster enthält. Am besten verwenden Sie ein buntes oder schwarz-weiß Bild. Wenn Sie ein buntes Bild verwenden, ist ein direkter Vergleich mit dem Endergebnis schwierig, da dieses ohnehin schwarz-weiß sein wird. Daher wird empfohlen, den Code zunächst mit dem gewählten Bild auszuführen, um die Ergebnisse zu überprüfen.
img = imread("Ergebnisse_VonSynthetischenDruckraster_ZuNormal\PommesPizza.jpg");
img = im2gray(img);
imwrite(img,"Ergebnisse_VonSynthetischenDruckraster_ZuNormal\BlackWhite_PommesPizza.jpg")
| zu Schwarz-Weiß konvertieren |
Dieses Schwarz-Weiß-Bild stellt das angestrebte Zielergebnis dar. Öffnen Sie anschließend die Datei SynthetischeBilderErzeugen.mlx, um aus diesem Bild ein synthetisches AM-Druckmuster zu erzeugen.
SynthetischeBilderErzeugen.mlx
In Schritt 2 ist der Pfad zum entsprechenden Bild anzugeben. Nach Abschluss des Prozesses wird das Bild mit dem generierten Druckmuster ausgegeben. Details zur Funktionsweise der Funktion Druckraster_erstellen_function sind im entsprechenden Abschnitt dieses Artikels dokumentiert.
%Synthetische Bilder erzeugen
%Schritt 1:
clear; clc; close all;
%Schritt 2: Bild laden
img = imread('E:\MATLAB_Vorkurs\Signalverarbeitung_mit_Kuenstlicher_Intelligenz\mFiles\DruckrasterEntfernen\2026\1\Ergebnisse_VonSynthetischenDruckraster_ZuNormal\PommesPizza.jpg'); % <-- HIER dein Bild einsetzen
%Schritt 3: Wichtige Parameter
RasterPerioden = 15; % Rasterzellengröße
FaktorRadius = 0.75; % Punktgroessen-Faktor
ScaleFaktor = 5; % Bildskalierung
%Schritt 4: AM-Druckraster erzeugen mit einer custom Funktion
AM = Druckmuster_erstellen_function( ...
img, RasterPerioden, FaktorRadius, ScaleFaktor);
%Schritt 5: Speichern
imwrite(AM, 'Synthetisches_PommesPizza.png');
| zu einem Synthetischen AM-Raster konvertieren |
Die Parameter sind das Wichtigste Maß, damit die KI erfolgreich das Raster entfernen kann. Die Rasterperiode gibt an bis zu wie viel Platz jeder Dot zu verfügung hat. Der FaktorRadius manipuliert nochmal die Größe der Dots und der Scale Faktor bestimmt wie sehr ein Bild skaliet werden soll. Das Netzwerk wurde darauf trainiert mit 16 Dots Minimum das Schwarz-Weiß Bild zu rekonstruiren. Betrachte folgende Rechnung:
Die Anzahl der Abtastpunkte N in horizontaler (x-) und vertikaler (y-) Richtung ergibt sich ungefähr aus:
wobei
- und die Bildabmessungen in Pixeln,
- der Skalierungsfaktor,
- die Rasterperiode
repräsentieren.
Erster Versuch
Eingangsbild = 500x500
RasterPerioden = 50; % Rasterzellengröße
FaktorRadius = 1; % Punktgroessen-Faktor
ScaleFaktor = 1; % Bildskalierung
Für die horizontale und vertikale Richtung gilt:
Damit repräsentieren etwa
Abtastpunkte das gesamte Bild.
Diese Anzahl ist offensichtlich zu gering, um das Bild angemessen darzustellen.
Zweiter Versuch
Eingangsbild = 500x500
RasterPerioden = 5; % Rasterzellengröße
FaktorRadius = 1; % Punktgroessen-Faktor
ScaleFaktor = 1; % Bildskalierung
Damit repräsentieren etwa
das Gesamtbild.
Dadurch würde man an sich mehr Rasterpunkte erhalten aber die einzelnen Dots wären nicht mehr so vielfältig und genau. Dann könnte man noch den Ansatz in Erwägung ziehen einfach beide Werte sehr stark zu vergrößern.
Dritter Versuch
Eingangsbild = 500x500
RasterPerioden = 50; % Rasterzellengröße
FaktorRadius = 1; % Punktgroessen-Faktor
ScaleFaktor = 10; % Bildskalierung
Damit repräsentieren etwa
das Gesamtbild.
Hier würde man wieder die gleiche Anzahl an Dots erhalten aber die Dots selber würden eine größere Varriation aufweisen. Trotzdem sind 100 dots für ein 5000x5000 relativ wenig. Und wenn man die Werte einfach noch mehr vergrößert wird das Bild genauer. Trotzdem muss man im klaren sein, dass sich das Bild proportional ebenso vergrößert durch den Skale Faktor und wenn das Bild sehr groß wird braucht die KI Zeitlich gesehen deutlich länger.
Letzter Versuch
Das sind Beispielhafte gute Werte:
Eingangsbild = 3000x4000
RasterPerioden = 15; % Rasterzellengröße
FaktorRadius = 0.75; % Punktgroessen-Faktor
ScaleFaktor = 5; % Bildskalierung
Damit repräsentieren etwa
das Gesamtbild. Außerdem erkennt man, dass sich wie aus dem Beispiel vorher erklärt das Bild sich sehr stark vergrößert (1500x20000)
PommesPizza_Druckmuster_erstellen_Vollstaendig.mlx
PommesPizza_Druckraster_erstellen_function.mlx
PommesPizza_Druckraster_erstellen_function2.mlx
Ein kleines Probelm
Eingangsbild = 481x321
RasterPerioden = 48; % Rasterzellengröße
FaktorRadius = 1; % Punktgroessen-Faktor
ScaleFaktor = 1; % Bildskalierung
Die Abtastung erfolgt mit einer Rasterperiode von 48 Pixeln. Da 48 kein Teiler der Bildabmessungen ist, ergeben sich keine ganzzahligen Abtastpunkte:
Diese Werte beschreiben lediglich die Anzahl der Rasterperioden über dem Bild. Eine direkte Interpretation als Anzahl diskreter Bildpunkte ist nicht zulässig, da am Bildrand partielle Rasterzellen entstehen.
Trotzdem kann diese Rechnung einen ungefähren Wert Angeben wie viele Abtastpunkte entstanden sind!
KI_Test_Fertig.mlx
Mit dieser Datei lässt sich ein feines AM-Raster zuverlässig entfernen. Dazu muss in Schritt 2 lediglich der entsprechende Pfad angegeben werden. Um den Arbeitsspeicher effizient zu nutzen, wird beim Anwendungsbild ebenfalls mit Patches gearbeitet (Schritt 3).
Dabei ist zu berücksichtigen, wie viele Rasterzellen bei der Erstellung verwendet wurden. Entscheidend ist, dass die Patchgröße mindestens Rasterzellen × 16 beträgt, da sonst die KI aus einem grob gerasterten Bild schlecht das Orginal erstellt. In Versuch 1 hatten wir 10x10 was selbst fuer ein Patch zu klein ist weswegen es nichtmal sinnvoll ist diese zu testen.
Ergebnis von Versuch 2
Der Hintergrund ist, dass das Netzwerk während des Trainings stets mit einer ausreichenden Anzahl an Bildpunkten („Dots“) gearbeitet hat. Bei zu wenigen Punkten stehen dem Modell nicht genügend Informationen zur Verfügung, um verlässlich zu lernen und zu generalisieren.
Ergebnis von Versuch 3
Ergebnis vom letzten Versuch
PommesPizza_Druckraster_erstellen_function2.mlx
wurde zu
Weiter Ergänzungen und Ideen
Hier ist ein Text









