Java DIP - Comprendre la convolution

La convolution est une opération mathématique sur deux fonctions f et g. Les fonctions f et g dans ce cas sont des images, car une image est également une fonction bidimensionnelle.

Exécution de la convolution

Afin d'effectuer la convolution sur une image, les étapes suivantes sont effectuées -

  • Retournez le masque (horizontalement et verticalement) une seule fois.
  • Faites glisser le masque sur l'image.
  • Multipliez les éléments correspondants puis ajoutez-les.
  • Répétez cette procédure jusqu'à ce que toutes les valeurs de l'image aient été calculées.

Nous utilisons OpenCV fonction filter2Dpour appliquer la convolution aux images. Il peut être trouvé sousImgprocpaquet. Sa syntaxe est donnée ci-dessous -

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Les arguments de la fonction sont décrits ci-dessous -

N ° Sr. Argument et description
1

src

C'est l'image source.

2

dst

C'est l'image de destination.

3

depth

C'est la profondeur de dst. Une valeur négative (telle que -1) indique que la profondeur est la même que la source.

4

kernel

C'est le noyau à scanner à travers l'image.

5

anchor

C'est la position de l'ancre par rapport à son noyau. Le point de localisation (-1, -1) indique le centre par défaut.

6

delta

C'est une valeur à ajouter à chaque pixel lors de la convolution. Par défaut, il est 0.

sept

BORDER_DEFAULT

Nous laissons cette valeur par défaut.

Exemple

L'exemple suivant illustre l'utilisation de la classe Imgproc pour effectuer la convolution sur une image en niveaux de gris.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 3;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,0);
               put(0,1,0);
               put(0,2,0);

               put(1,0,0);
               put(1,1,1);
               put(1,2,0);

               put(2,0,0);
               put(2,1,0);
               put(2,2,0);
            }
         };
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("original.jpg", destination);
         
      } catch (Exception e) {
          System.out.println("Error:" + e.getMessage());
      }
   }
}

Production

Dans cet exemple, nous convoluons notre image avec le filtre suivant (noyau). Ce filtre permet de produire l'image originale telle quelle -

0 0 0
0 1 0
0 0 0

Image originale

Image convoluée