При применении матрицы свёртки полученное изображения становится черным

import org.opencv.core.Core;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.IOException;

Здравствуйте! Пытаюсь реализовать свертку изображения, где коэффициенты матрицы свертки мы можем настраивать и менять сами через интерфейс, с последующим сохранением изображения с фильтром blur в новый файл. То есть по сути менять значения в массиве. Далее из массива делать матрицу и в последствии применить её на изображение. Идея кода такая:

  1. метод createBufferedImages считывает изображение и заполняет originalImage
    private void createBufferedImages() {
    
            Image image = new ImageIcon("src\\Screenshot_1.png").getImage();
            height = image.getHeight(null);
            width = image.getWidth(null);
            System.out.println("Height : " + height);
            System.out.println("Width : " + width);
    
            originalImage = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
        }
  1. заполняем ячейки массива и сохраняем сам массив, нажав кнопку "change mat", cлушатель c1.setSettings
public static void main(String[] args) throws IOException {
        Main c1 = new Main();
        c1.interfaceMe();
        c1.createBufferedImages();
        c1.setSettings.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                c1.MatArray[0] = Float.parseFloat(c1.a_Field.getText());
                c1.MatArray[1] = Float.parseFloat(c1.b_Field.getText());
                c1.MatArray[2] = Float.parseFloat(c1.c_Field.getText());
                c1.MatArray[3] = Float.parseFloat(c1.d_Field.getText());
                c1.MatArray[4] = Float.parseFloat(c1.e_Field.getText());
                c1.MatArray[5] = Float.parseFloat(c1.f_Field.getText());
                c1.MatArray[6] = Float.parseFloat(c1.g_Field.getText());
                c1.MatArray[7] = Float.parseFloat(c1.i_Field.getText());
                c1.MatArray[8] = Float.parseFloat(c1.k_Field.getText());
                System.out.println("its working");
            }
        });
        c1.label.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                c1.blur(c1.originalImage, c1.MatArrayTest);
                System.out.println("its working 2");
            }
        });
        c1.downloadThat.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ek) {
                try {
                    ImageIO.write(c1.bufferedImage, "png", new File("src/Screenshot_4.png"));

                } catch (IOException ex) {
                    System.out.println("изображение не создало новый файл");
                }

                System.out.println("its working 3");
            }
        });
    }
  1. Нажав кнопку new image, применяем метод blur, передав в него матрицу и картинку, сохраняем полученное изображение в bufferedImage
    public BufferedImage blur(BufferedImage img, float[] matArray) {

        System.out.println(height);
        System.out.println(width);
        BufferedImageOp op = new ConvolveOp(new Kernel(3, 3, matArray));
        bufferedImage = op.filter(img, null);

        return op.filter(img, null);
    }
  1. Нажав кнопку "download" формируется файл png и туда передается картинка.

Проблема: на выходе выдается чёрная картинка. В чем моя ошибка? Изменения входных данных матрицы, то есть в массив записываем сразу числа поделенные на коэффициент, например, 0.1, 0.25 - не помогает, все-равно черный экран:( У меня есть предположение, что метод blur не отрабатывает, но вероятнее всего где-то я что-то не то передаю в функции. Хотел бы вообще не использоваться blur, так как нигде понятной для меня документации не нашел о нем, но мне показалось это наиболее быстрым и простым решением моей задачки. Джаву изучаю всего ничего, но задание как-то надо делать,поэтому буду только рад советам о том, как это можно было бы всё оптимизировать. Хотя пусть сначала бы понять, почему не работает, а со стороны выглядит вроде ничего так:)

Весь код:

public class Main extends JFrame {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        System.out.println("Version: " + Core.VERSION);
    }

    JTextField a_Field;
    JTextField b_Field;
    JTextField c_Field;
    JTextField d_Field;
    JTextField e_Field;
    JTextField f_Field;
    JTextField g_Field;
    JTextField i_Field;
    JTextField k_Field;

    JButton setSettings;
    JButton label;
    JButton downloadThat;

    BufferedImage originalImage;
    BufferedImage bufferedImage;
    int height = 1000, width = 1000;
    float val1 = 1f / 9f;
    float val2 = 1f / 9f;
    float val3 = 1f / 9f;
    float val4 = 1f / 9f;
    float val5 = 1f / 9f;
    float val6 = 1f / 9f;
    float val7 = 1f / 9f;
    float val8 = 1f / 9f;
    float val9 = 1f / 9f;
    float[] MatArray = {val1, val2, val3, val4, val5, val6, val7, val8, val9};

    // load image
    private void createBufferedImages() {
        Image image = new ImageIcon("src\\Screenshot_1.png").getImage();
        height = image.getHeight(null);
        width = image.getWidth(null);
        System.out.println("Height : " + height);
        System.out.println("Width : " + width);
        originalImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
    }
    public BufferedImage blur(BufferedImage img, float[] matArray) {
        System.out.println(height);
        System.out.println(width);
        BufferedImageOp op = new ConvolveOp(new Kernel(3, 3, matArray));
        bufferedImage = op.filter(img, null);

        return op.filter(img, null);
    }
    public static void main(String[] args) throws IOException {
        Main c1 = new Main();
        c1.interfaceMe();
        c1.createBufferedImages();
        c1.setSettings.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                c1.MatArray[0] = Float.parseFloat(c1.a_Field.getText());
                c1.MatArray[1] = Float.parseFloat(c1.b_Field.getText());
                c1.MatArray[2] = Float.parseFloat(c1.c_Field.getText());
                c1.MatArray[3] = Float.parseFloat(c1.d_Field.getText());
                c1.MatArray[4] = Float.parseFloat(c1.e_Field.getText());
                c1.MatArray[5] = Float.parseFloat(c1.f_Field.getText());
                c1.MatArray[6] = Float.parseFloat(c1.g_Field.getText());
                c1.MatArray[7] = Float.parseFloat(c1.i_Field.getText());
                c1.MatArray[8] = Float.parseFloat(c1.k_Field.getText());
                System.out.println("its working");
            }
        });
        c1.label.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                c1.blur(c1.originalImage, c1.MatArray);
                System.out.println("its working 2");
            }
        });
        c1.downloadThat.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ek) {
                try {
                    ImageIO.write(c1.bufferedImage, "png", new File("src/Screenshot_4.png"));
                } catch (IOException ex) {
                    System.out.println("изображение не создало новый файл");
                }

                System.out.println("its working 3");
            }});
    }
        public void interfaceMe() {
        JFrame window = new JFrame("matrix");
        JLabel screen = new JLabel();
        window.setBounds(5, 5, 500, 500);
        window.setLayout(null);
        System.out.println("тест");
        a_Field = new JTextField();
        b_Field = new JTextField();
        c_Field = new JTextField();
        d_Field = new JTextField();
        e_Field = new JTextField();
        f_Field = new JTextField();
        g_Field = new JTextField();
        i_Field = new JTextField();
        k_Field = new JTextField();
        setSettings = new JButton("change mat");
        label = new JButton("new image");
        downloadThat = new JButton("download");
        a_Field.setBounds(150, 60, 50, 50);
        b_Field.setBounds(210, 60, 50, 50);
        c_Field.setBounds(270, 60, 50, 50);
        d_Field.setBounds(150, 130, 50, 50);
        e_Field.setBounds(210, 130, 50, 50);
        f_Field.setBounds(270, 130, 50, 50);
        g_Field.setBounds(150, 190, 50, 50);
        i_Field.setBounds(210, 190, 50, 50);
        k_Field.setBounds(270, 190, 50, 50);
        setSettings.setBounds(200, 260, 75, 50);
        label.setBounds(300, 260, 140, 50);
        downloadThat.setBounds(300, 310, 140, 50);
        window.add(a_Field);
        window.add(b_Field);
        window.add(c_Field);
        window.add(d_Field);
        window.add(e_Field);
        window.add(f_Field);
        window.add(g_Field);
        window.add(i_Field);
        window.add(k_Field);
        window.add(setSettings);
        window.add(label);
        window.add(downloadThat);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
    }
}

Ответы (0 шт):