Lizard & Dog Blog

Transformer des images avec OpenCV et Java : réaliser des filtres facilement

Introduction

Dans cet article, nous verrons comment implémenter facilement des effets de filtres sur des images avec Java. Nous allons couvert différentes techniques, telles que la conversion en niveaux de gris et les tons sépia, la manipulation des canaux de couleur et l’ajustement des valeurs HSV.

Les méthodes décrites dans cet article peuvent servir de base pour la création de filtres plus complèxes, comme ceux d’instagram.

Étape 1 – Configuration d’OpenCV :

Pour commencer, tu dois avoir OpenCV installé et correctement configuré dans ton projet Java. Si tu n’as pas encore intégré OpenCV dans ton projet, suis les instructions d’installation spécifiques à ta plateforme et à ton IDE. Une fois qu’OpenCV est intégré avec succès, tu peux passer à l’étape suivante.

Nous utiliserons des objets Bitmap en tant qu’entrées, car cette classe est souvent utilisée dans Android pour les applications mobiles. Pour d’autres programmes, tu peux directement utiliser des matrices OpenCV.

Étape 2 – Filtre Noir et Blanc:

La méthode grayScale ci-dessous prend en entrée une image Bitmap et la transforme en nuances de gris. Pour ce faire, elle transforme d’abord le Bitmap en une représentation matricielle puis lui applique la nuance de gris à l’aide de la méthode cvtColor. Enfin, elle reconvertit la Matrice en Bitmap.

public static void grayScale(Bitmap bitmapSource, Bitmap bitmapResult){  
      
Mat sourceMat = new Mat(); // This is the Matrix of the source Image         Utils.bitmapToMat(bitmapSource,sourceMat);         
Mat resultMat = new Mat(); // This is the Matrix of the grayScale Image         Imgproc.cvtColor(resultMat,sourceMat,Imgproc.COLOR_RGBA2GRAY);         Utils.matToBitmap(resultMat,bitmapResult); // Now the bitmapResult is in grayScale     
}

Etape 3 – Filtre Sepia:

De manière similaire au filtre noir et blanc, le code ci-dessous prend une Matrice en couleur et lui applique un effet sepia (attention, il est possible que certaines valeurs de la matrice doivent être modifiées pour obtenir le niveau de sepia désiré)

    public static void applySepia(Mat sourceMat, Mat resultMat){

        Mat sepiaKernel = new Mat(3, 3, CvType.CV_32F);
        sepiaKernel.put(0, 0, 0.272f,0.534f , 0.131f);
        sepiaKernel.put(1, 0, 0.349f, 0.686f,  0.168f);
        sepiaKernel.put(2, 0, 0.393f, 0.769f, 0.189f);
        Core.transform(sourceMat, resultMat, sepiaKernel);

    }

Etape 4 – Jouer avec les couleurs:

Si tu souhaites modifier les niveaux de rouge, bleu et vert d’une image, tu peux utiliser la méthode ci-dessous. Cette dernière permet de séparer la matrice selon les trois canaux de couleur et d’appliquer un coefficient à chacun de ceux-ci, puis de les réintégrer dans la matrice finale.

    public static void changeColor(Mat sourceMat, Mat resultMat, float redValue, float blueValue, float greenValue){
        ArrayList<Mat> channelsRGB = new ArrayList<>();
        Core.split(sourceMat,channelsRGB);
        Core.multiply(channelsRGB.get(0),new Scalar(redValue),channelsRGB.get(0));
        Core.multiply(channelsRGB.get(1),new Scalar(greenValue),channelsRGB.get(1));
        Core.multiply(channelsRGB.get(2),new Scalar(blueValue),channelsRGB.get(2));
        Core.merge(channelsRGB,resultMat);
    }

Etape 5 – Jouer avec HSV:

Le code ci-dessous permet de modifier la teinte (Hue en anglais), la saturation et la valeur d’une image. Cela permet de modifier le ton des couleurs de l’image, leur intensité ainsi que la luminosité de l’image. La méthode fonctionne similairement à la méthode changeColor, avec la distinction que nous convertissons d’abord la Mat en HSV avant de la séparer selon les canaux.

    public static void changeHSV(Mat sourceMat, Mat resultMat,float HValue, float SValue, float VValue){
        ArrayList<Mat> channelsHSV = new ArrayList<>();
        Imgproc.cvtColor(sourceMat, resultMat, Imgproc.COLOR_BGR2HSV);
        Core.split(resultMat,channelsHSV);
        Core.multiply(channelsHSV.get(0),new Scalar(HValue),channelsHSV.get(0));
        Core.multiply(channelsHSV.get(1),new Scalar(SValue),channelsHSV.get(1));
        Core.multiply(channelsHSV.get(2),new Scalar(VValue),channelsHSV.get(2));
        Core.merge(channelsHSV,resultMat);
        Imgproc.cvtColor(resultMat, resultMat, Imgproc.COLOR_HSV2BGR);
    }

Conclusion:

Les filtres présentés ici peuvent fournir une base pour réaliser des effets plus complèxes, comme des filtres type instagram, en les combinant et en expérimentant avec.

Leave a comment

Create a website or blog at WordPress.com