Как размыть часть изображения с помощью JAVA

как размыть часть изображения, чтобы скрыть некоторые частные части, такие как информация о кредитной карте.

Я пытаюсь использовать ConvolveOp.класс :

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);

это, кажется, работает, за исключением того, что изображение полностью размыто.

2 ответов


я не знаю, можно ли это сделать, изменив значения матрицы, но это определенно должно быть возможно путем фильтрации подизображения, так как, согласно BufferedImage.getSubimage() документы:

возвращенный BufferedImage разделяет тот же массив данных, что и исходное изображение.

так оригинал BufferedImage должен измениться с кодом, как это:

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);

я не тестировал это, хотя, и я могу себе представить, что filter не работает так, как ожидалось, если source и destination одинаковы, и в этом случае вы можете использовать копию подизображения, используя решение из этот вопрос:

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);

после этого продолжайте работать с image (не subImage, src или dest!)


Если вы хотите сосредоточиться на приложении, а не на особенностях обработки изображений, вы можете использовать фреймворк обработки изображений, например Марвин. Таким образом, вы можете сделать больше с меньшим количеством кода.

ввода изображения:

enter image description here

выходное изображение:

enter image description here

исходный код:

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);
    }
}

размытие по Гауссу исходный код алгоритма:

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