При применении матрицы свёртки полученное изображения становится черным
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 в новый файл. То есть по сути менять значения в массиве. Далее из массива делать матрицу и в последствии применить её на изображение.
Идея кода такая:
- метод 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);
}
- заполняем ячейки массива и сохраняем сам массив, нажав кнопку "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");
}
});
}
- Нажав кнопку 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);
}
- Нажав кнопку "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);
}
}