如何用JAVA模糊图像的一部分
如何模糊图像的一部分,隐藏一些隐私部分,如信用卡信息 我尝试使用ConvolveOp.class,如:如何用JAVA模糊图像的一部分,java,image-processing,blur,Java,Image Processing,Blur,如何模糊图像的一部分,隐藏一些隐私部分,如信用卡信息 我尝试使用ConvolveOp.class,如: 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
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);
float[]矩阵=新浮点[400];
对于(int i=0;i<400;i++)
矩阵[i]=1.0f/500.0f;
BuffereImage sourceImage=(BuffereImage)image;
buffereImage destImage=null;
BufferedImageOp op=new ConvolveOp(新内核(20,20,矩阵),ConvolveOp.EDGE_NO_op,null);
BuffereImage blurredImage=op.filter(源图像,目标图像);
除了图像完全模糊外,它似乎可以工作。我不知道是否可以通过更改矩阵值来实现,但通过过滤子图像肯定可以做到这一点,因为根据文档: 返回的
buffereImage
与原始图像共享相同的数据数组
因此,原始缓冲区图像
应使用如下代码进行更改:
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);
但是我没有对此进行测试,我可以想象,如果源和目的地相同,则过滤器无法按预期工作,在这种情况下,您可以使用子映像的副本,使用以下解决方案:
之后,继续使用image
(notsubImage
,src
或dest
!)如果您想专注于应用程序而不是图像处理的细节,可以使用类似的图像处理框架。因此,您可以用更少的代码做更多的事情
输入图像:
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);
}
}
输出图像:
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);
}
}
源代码:
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);
}
}
高斯模糊算法源代码:
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);
}
}
我真的帮不了你,我只是想插话告诉你,你的问题实际上教会了我一些关于卷积图像和模糊的知识,谢谢你!)此解决方案将图像分为两部分。那么有可能合并吗?你说的“分为两部分”是什么意思?模糊区域和非模糊区域?或者到底发生了什么?因为正如我所说,我没有测试这个。是的,模糊区域和非模糊区域是分开的。但是像。。。彼此挨着,还是一个在另一个里面?对不起,我的英语质量太高了。所以,问题是我不知道如何保存图像上的更改。我试图创建一个新的图像(模糊),但它只保存图像的一部分(模糊区域)!!!但在这种情况下,高斯模糊法是什么?高斯模糊法(输入图像、输出图像、半径、像素、遮罩)使用高斯函数模糊图像。维基百科上的高斯模糊:你能给我们一个使用java的这种方法的例子吗?根据你最近的变化,我编辑了你的answer@KarimOukara您可以从URL请求一个图像,创建一个BuffereImage,然后使用构造器new MarvinImage(BuffereImage)创建一个MarvinImage。正在从Java中的URL加载图像: