Ich habe ungefähr 1.400 JPEGs, die irgendwie beschädigt wurden und die Backup-Images verloren haben. Sie scheinen alle das gleiche Gittermuster von Linien über jedem zu haben (dh das Gitter verschiebt sich nicht von Bild zu Bild.
So sieht eines dieser Bilder aus:
Gibt es Bildfiltertechniken in Matlab, insbesondere oder auf andere Weise, die dieses Gittermuster entfernen oder glätten?
Antworten:
Sie können einen Standard-Inpainting-Algorithmus verwenden. Diese Algorithmen ersetzen markierte Pixel in einem Bild durch die Pixelwerte, die diese markierten Pixel umgeben. Die Herausforderung besteht hier darin, das Gitter zu erkennen (meine Tests scheinen zu zeigen, dass es kein vollständig reguläres Gitter ist). Also habe ich mir diese Lösung ausgedacht:
Die Programmausgabe lautet wie folgt:
Um das Gitter zu erkennen, habe ich eine schnelle und schmutzige Lösung gefunden. Es kann viel verbessert werden, aber es zeigt die ursprüngliche Idee. Der allgemeine Ablauf ist:
Zum Inpainting habe ich OpenCV Inpaint verwendet. Zur Erkennung des Gitters habe ich eine Kantenerkennung in X- und Y-Richtung mit einem Sobel-Filter durchgeführt. Dann addiere ich alle Kantenwerte in X- und Y-Richtung, um Spitzen zu finden, bei denen sich die Gitterlinien befinden. Dann wähle ich die höchsten Spitzen als Koordinaten, bei denen die Gitterlinien geschätzt werden. Es funktioniert nicht perfekt (z. B. werden starke Kanten im Bild fälschlicherweise als Gitterlinien erkannt), aber es zeigt die Idee. Es kann zB durch Hough-Transformation verbessert werden, um Linien zu finden, sehr starke Kanten herauszuschmeißen usw.
Wenn das Raster für alle Bilder wirklich gleich ist, können Sie alternativ die Rastererkennung für alle Bilder gemeinsam durchführen, was zu einer viel besseren Genauigkeit führen würde (führen Sie einfach die oben beschriebene Technik aus, aber fassen Sie die Ergebnisse aus zusammen, bevor Sie die Peaks auswählen alle Bilder). Im Detail würden Sie eX für alle Bilder berechnen und alle diese eX zu einem einzigen Vektor addieren. Dieser Vektor hat eine viel klarere Peakstruktur und die Schwellenwertbildung kann einfacher durchgeführt werden.
quelle
Ich habe einen wirklich einfachen Algorithmus ausprobiert, bei dem ein 3x3-Medianfilter auf den R- und G-Kanälen dieses Bildes ausgeführt wird, und er funktioniert recht gut. Der Python-Code ist wirklich einfach:
Alternativ können Sie die Frequenzbereichsfilterung wie in dieser Frage beschrieben verwenden: /programming/34027840/removing-periodic-noise-from-an-image-using-the-fourier-transform
Die Fourier-Transformation Ihres Bildes zeigt deutlich einige wiederholte "Punkte" im Spektrum, die diesem periodischen Rauschen entsprechen.
Wie Maximilian betonte, funktioniert diese letztere Methode nur dann gut, wenn das Rauschen perfekt periodisch ist, was hier nicht der Fall zu sein scheint.
Ich habe versucht, einen wirklich dummen Filter zu verwenden, der 5x5 Quadrate von Frequenzbereichen, die um ein Vielfaches von 9 in x- und y-Richtung zentriert sind, auf Null setzt und das Rauschen (irgendwie) unterdrückt, aber Artefakte an Orten einführt, die kein Rauschen enthalten (z Himmel).
Mit einem sorgfältigen Notch-Filter-Design kann man es vielleicht besser machen, anstatt die FFT-Bins direkt auf Null zu setzen ( in der Praxis niemals! ) Und den Filter nur in Bereichen des Bildes anzuwenden, in denen das Rauschen vorhanden ist (dh den Himmel nicht filtern).
quelle