2015-07-27 21 views
9

Jak zamazać część obrazu, aby ukryć niektóre niepodzielne części, takie jak informacje o karcie kredytowej.Jak zamazać część obrazu za pomocą JAVA

próbuję użyć ConvolveOp.class jak:

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

wydaje się działać, chyba, że ​​obraz jest całkowicie rozmazany.

+2

Nie mogę ci pomóc, powiedział, że jest po prostu chciałem, aby dostroić się i powiedzieć, że sprawa rzeczywiście nauczył mnie czegoś o splatanie obrazów i rozmycie, dzięki za to! :) –

Odpowiedz

1

Nie wiem, czy można to zrobić przez zmianę wartości macierzy, ale to zdecydowanie powinien być możliwy przez filtrowanie subimage, ponieważ, zgodnie z dokumentacją BufferedImage.getSubimage():

Zwracany BufferedImage akcji ta sama tablica danych co oryginalny obraz.

Więc oryginalnyBufferedImage powinien zmienić z kodu:

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

Nie testowałem tego, choć i mogę sobie wyobrazić, że filter nie działa zgodnie z oczekiwaniami, jeśli source i destination są takie same, w takim przypadku można użyć kopii subimage, korzystając z rozwiązania z this 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); 

Po tym, kontynuować pracę z image (niesubImage, src lub dest!)

+0

To rozwiązanie tnie obraz na dwie części. czy można wtedy scalić? –

+0

Co masz na myśli "na dwie części"? Zamazany obszar i niezamazany obszar? A co dokładnie się dzieje? Ponieważ, jak powiedziałem, nie przetestowałem tego. – Siguza

+0

Tak, rozmazany obszar i niezrozmyty obszar są oddzielone. –

1

W przypadku, gdy chcemy skupić się na wniosku, a nie od specyfiki przetwarzania obrazu, można użyć ramy przetwarzania obrazu jak Marvin. W ten sposób można zrobić więcej przy użyciu mniejszej ilości kodu.

obraz wejściowy:

enter image description here

wyjścia obrazu:

enter image description here

kod źródłowy:

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

rozmycie Gaussa kod źródłowy algorytmu:

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

+0

, ale jaka jest metoda gaussianBlur w tym przypadku? –

+0

gaussianBlur (input_image, output_image, radius, pixels_mask) zaciera obraz za pomocą funkcji Gaussa. Gaussian Blur na Wikipedii: https://en.wikipedia.org/wiki/Gaussian_blur –

+0

czy możesz podać nam przykład tej metody używając java? –

Powiązane problemy