J'ai environ 1 400 fichiers JPEG qui ont été corrompus d'une manière ou d'une autre et ont perdu les images de sauvegarde. Ils semblent tous avoir le même motif quadrillé de lignes sur chacun (c'est-à-dire que le quadrillage ne se déplace pas d'une image à l'autre.
Voici à quoi ressemble l'une de ces images:
Existe-t-il des techniques de filtrage d'image dans Matlab, en particulier ou autrement, qui supprimeront ou lisseront ce motif de quadrillage?
Réponses:
Vous pouvez utiliser un algorithme de peinture standard. Ces algorithmes remplacent les pixels marqués d'une image par les valeurs de pixels qui entourent ces pixels marqués. Le défi ici est de détecter la grille (mes tests semblent montrer que ce n'est pas une grille complètement régulière). J'ai donc trouvé cette solution:
La sortie du programme est la suivante:
Pour détecter la grille, j'ai fait une solution rapide et sale. Il peut être beaucoup amélioré, mais il montre l'idée initiale. Le flux général est le suivant:
Pour l'inpainting, j'ai utilisé l' opération Inpaint d' OpenCV . Pour détecter la grille, j'ai effectué une détection de bord dans les directions X et Y en utilisant un filtre Sobel. Ensuite, j'ajoute toutes les valeurs de bord dans la direction X et la direction Y pour trouver des pics, où se trouvent les lignes de la grille. Ensuite, je choisis les pics les plus élevés comme coordonnées où les lignes de la grille sont estimées. Cela ne fonctionne pas parfaitement (par exemple, les bords forts de l'image sont faussement détectés comme des lignes de grille), mais cela montre l'idée. Il peut être amélioré par exemple par une transformation de Hough pour trouver des lignes, éliminer les bords très forts, etc.
Alternativement, si la grille est vraiment la même pour toutes les images, vous pouvez effectuer la détection de grille conjointement pour toutes les images, ce qui donnerait une bien meilleure précision (faites simplement la technique ci-dessus, mais avant de choisir les pics, résumez les résultats à partir de toutes les photos). Plus en détail, vous devez calculer l'eX pour toutes les images et ajouter tous ces eX ensemble dans un seul vecteur. Ce vecteur aura une structure de pic beaucoup plus claire et le seuillage peut être fait plus facilement.
la source
J'ai essayé un algorithme très simple pour exécuter un filtre médian 3x3 sur les canaux R et G de cette image et cela fonctionne assez bien. Le code python est vraiment simple:
Vous pouvez également utiliser le filtrage du domaine fréquentiel comme indiqué dans cette question: /programming/34027840/removing-periodic-noise-from-an-image-using-the-fourier-transform
La transformée de Fourier de votre image montre clairement quelques "points" répétés dans le spectre correspondant à ce bruit périodique.
Comme l'a souligné Maximilien, cette dernière méthode ne fonctionne bien que si le bruit est parfaitement périodique, ce qui ne semble pas être le cas ici.
J'ai essayé d'exécuter un filtre vraiment stupide qui met à zéro des carrés de 5 x 5 cases de fréquence centrées sur des multiples de 9 dans les directions x et y et il (en quelque sorte) supprime le bruit mais introduit des artefacts dans des endroits qui ne contiennent pas de bruit (par exemple, le ciel).
On peut peut-être faire mieux avec une conception soignée du filtre coupe-bande au lieu de mettre à zéro directement les bacs FFT ( ne faites jamais cela en pratique! ) Et d'appliquer le filtre uniquement dans les régions de l'image où le bruit est présent (c'est-à-dire ne pas filtrer le ciel).
la source