Comment flouter une partie d'une image avec JAVA


Comment flouter une partie d'une image, pour masquer certaines parties privées comme les informations de carte de crédit.

J'essaie d'utiliser ConvolveOp.classe comme:

float[] matrix = new float[400];
for (int i = 0; i < 400; i++)
    matrix[i] = 1.0f/500.0f;

BufferedImage sourceImage =  (BufferedImage) image; ;
BufferedImage destImage = null ;
BufferedImageOp op = new ConvolveOp( new Kernel(20, 20, matrix), ConvolveOp.EDGE_NO_OP, null );
BufferedImage blurredImage = op.filter(sourceImage, destImage);

, Il semble fonctionner, sauf que l'image est complètement floue.

Author: Karim Oukara, 2015-07-27

2 answers

Je ne sais pas si cela peut être fait en changeant les valeurs de la matrice, mais cela devrait certainement être possible en filtrant une sous-image, car, selon le BufferedImage.getSubimage() documentation:

Retournés BufferedImage partage le même tableau de données que l'image d'origine.

Si le original BufferedImage devrait changer avec ce code:

BufferedImage image = /* ... */;
BufferedImage subImage = image.getSubimage(10, 20, 30, 40); // x, y, width, height
new ConvolveOp(new Kernel(20, 20, matrix), ConvolveOp.EDGE_NO_OP, null).filter(subImage, subImage);

Je n'ai pas testé ce que, et je peux imaginer que filter ne fonctionne pas comme prévu si source et destination sont les mêmes, auquel cas vous pouvez utiliser une copie de la sous-image, en utilisant la solution de cette question:

BufferedImage image = /* ... */;
BufferedImage dest = image.getSubimage(10, 20, 30, 40);  // x, y, width, height
ColorModel cm = dest.getColorModel();
BufferedImage src = new BufferedImage(cm, dest.copyData(dest.getRaster().createCompatibleWritableRaster()), cm.isAlphaPremultiplied(), null).getSubimage(0, 0, dest.getWidth(), dest.getHeight());
new ConvolveOp(new Kernel(20, 20, matrix), ConvolveOp.EDGE_NO_OP, null).filter(src, dest);

Après cela, continuer à travailler avec image (pas subImage, src ou dest!)

 1
Author: Siguza, 2015-07-27 14:50:53

Dans le cas où vous souhaitez mettre l'accent sur l'application, et non sur les spécificités du traitement de l'image, vous pouvez utiliser un framework de traitement d'image comme Marvin. Ainsi, vous pouvez faire plus avec moins de code.

Image d'entrée:

entrez la description de l'image ici

Image de sortie:

entrez la description de l'image ici

Code source:

import static marvin.MarvinPluginCollection.*;

public class PortionBlur {
    public PortionBlur(){
        // 1. Load image
        MarvinImage image = MarvinImageIO.loadImage("./res/credit_card.jpg");

        // 2. Create masks for each blurred region
        MarvinImageMask mask1 = new MarvinImageMask(image.getWidth(), image.getHeight(), 38,170,345,24);
        MarvinImageMask mask2 = new MarvinImageMask(image.getWidth(), image.getHeight(), 52,212,65,24);
        MarvinImageMask mask3 = new MarvinImageMask(image.getWidth(), image.getHeight(), 196,212,65,20);
        MarvinImageMask mask4 = new MarvinImageMask(image.getWidth(), image.getHeight(), 38,240,200,20);

        // 3. Process Image with each mask
        GaussianBlur gaussianBlur = new GaussianBlur();
        gaussianBlur.load();
        gaussianBlur.attributes.set("radius",15);

        gaussianBlur.process(image.clone(), image, mask1);
        gaussianBlur.process(image.clone(), image, mask2);
        gaussianBlur.process(image.clone(), image, mask3);
        gaussianBlur.process(image.clone(), image, mask4);

        // 4. Save the final image
        MarvinImageIO.saveImage(image, "./res/credit_card_out.jpg");
    }
    public static void main(String[] args) {
        new PortionBlur();
        System.exit(0);
    }
}

Source de l'algorithme de flou gaussien code:

Https://github.com/gabrielarchanjo/marvinproject/blob/master/marvinproject/dev/MarvinPlugins/src/org/marvinproject/image/blur/gaussianBlur/GaussianBlur.java

 2
Author: Gabriel Ambrósio Archanjo, 2015-07-30 10:40:54