如何使用卷积核来模糊图像

问题描述 投票:0回答:1

所以,我在研究时发现的第一件事就是这个。我模仿了该网站的代码(如下所示),当我尝试时,图像稍微模糊了,以至于看不到。互联网上的进一步研究并没有告诉我任何我不知道的事情。我在 Java 代码中使用

ConvolveOp
Kernel
。我假设它没有像我想要的那样模糊图像的原因与
Kernel
的矩阵有关,但我不知道它需要什么值才能模糊图像。我正在寻找的是数组值中的模式,以及数组的大小,这将使其在滑动比例数字上变得模糊,并保持快速。

java swing convolution
1个回答
0
投票

需要更大的数组才能产生更多的模糊,我想出了如何使用动态计算的数组和下面的代码以及滑动值数组大小来进一步模糊所有内容。您可能会发现this网站对于不同类型的卷积也很有用。


import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ConvolveOpTest extends JFrame{
    JScrollPane scrollPane;
    BufferedImage image;
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            @Override
            public void run(){
                new ConvolveOpTest();
            }
        });
    }
    
    public ConvolveOpTest(){
        try{
            long timePrev = System.currentTimeMillis();
            image = ImageIO.read(new File("a.jpg"));
            int arrSize = 50;
            float matrix[][] = new float[arrSize][arrSize];
            for(int x = 0 ; x < matrix.length ; x++){
                for(int y = 0 ; y < matrix[0].length ; y++){
                    matrix[x][y] = 1f / matrix.length / matrix[0].length;
                }
            }
            
            ArrayList<Float> list = new ArrayList<>();
            for (int i = 0; i < matrix.length; i++) {
                for (int j = 0; j < matrix[i].length; j++) { 
                    list.add(matrix[i][j]); 
                }
            }

            float[] vector = new float[list.size()];
            for (int i = 0 ; i < vector.length; i++) {
                vector[i] = list.get(i);
            }
            
            ConvolveOp op = new ConvolveOp(new Kernel(matrix.length, matrix[0].length, vector));
            BufferedImage output = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
            image = op.filter(image, output);
            System.out.println(System.currentTimeMillis() - timePrev);
        }catch(IOException e){
            e.printStackTrace();
        }
        
        JPanel panel = new JPanel(){
            @Override
            public void paintComponent(Graphics g){
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D)g;
                g2.scale(0.5, 0.5);
                g2.drawImage(image, 0, 0, null);
            }
            
            @Override
            public Dimension getPreferredSize(){
                return new Dimension((int)(image.getWidth() * 0.5), (int)(image.getHeight() * 0.5));
            }
            
        };
        
        scrollPane = new JScrollPane(panel);
        
        setSize(new Dimension(1200,700));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(scrollPane);
        setVisible(true);
    }
    
    @Override
    public Dimension getPreferredSize(){
        return new Dimension(1200, 700);
    }
    
}
© www.soinside.com 2019 - 2024. All rights reserved.