diff --git a/lab_1/src/main/java/org/example/lab_1/Helpers/Helpers.java b/lab_1/src/main/java/org/example/lab_1/Helpers/Helpers.java index 7e25138..228b042 100644 --- a/lab_1/src/main/java/org/example/lab_1/Helpers/Helpers.java +++ b/lab_1/src/main/java/org/example/lab_1/Helpers/Helpers.java @@ -1,5 +1,8 @@ package org.example.lab_1.Helpers; +import javafx.scene.control.ProgressBar; +import javafx.scene.image.*; + public class Helpers { public static int CheckBit(int val, int min, int max){ if (val > max) { @@ -28,4 +31,107 @@ public class Helpers { } } } + + public static void MatrixFilter( ImageView imageView, double[][] matrix, String log) { + Image img = imageView.getImage(); + if (img == null) { + return; + } + + int w = (int) img.getWidth(); + int h = (int) img.getHeight(); + + PixelReader reader = img.getPixelReader(); + WritableImage Img = new WritableImage(w, h); + PixelWriter writer = Img.getPixelWriter(); + + for (int y = 1; y < h - 1; y++) { + for (int x = 1; x < w - 1; x++) { + + int sumRed = 0; + int sumGreen = 0; + int sumBlue = 0; + + + for (int dy = -1; dy <= 1; dy++) { + for (int dx = -1; dx <= 1; dx++) { + int argb = reader.getArgb(x + dx, y + dy); + int r = (argb >> 16) & 0xFF; + int g = (argb >> 8) & 0xFF; + int b = argb & 0xFF; + + sumRed += (int) (r * matrix[dy + 1][dx + 1]); + sumGreen += (int) (g * matrix[dy + 1][dx + 1]); + sumBlue += (int) (b * matrix[dy + 1][dx + 1]); + } + } + + int newRed = CheckBit(sumRed + 128, 0, 255); + int newGreen = CheckBit(sumGreen + 128, 0, 255); + int newBlue = CheckBit(sumBlue + 128, 0, 255); + + int a = (reader.getArgb(x, y) >> 24) & 0xFF; + + int newArgb = (a << 24) | (newRed << 16) | (newGreen << 8) | newBlue; + writer.setArgb(x, y, newArgb); + } + } + + imageView.setImage(Img); + System.out.println("Применен фильтр: " + log); + } + public static void DoubleMatrixFilter( ImageView imageView, double[][] gx, double[][] gy, String log) { + Image img = imageView.getImage(); + if (img == null) { + return; + } + + int w = (int) img.getWidth(); + int h = (int) img.getHeight(); + + PixelReader reader = img.getPixelReader(); + WritableImage Img = new WritableImage(w, h); + PixelWriter writer = Img.getPixelWriter(); + + for (int y = 1; y < h - 1; y++) { + for (int x = 1; x < w - 1; x++) { + int sumGxRed = 0, sumGxGreen = 0, sumGxBlue = 0; + int sumGyRed = 0, sumGyGreen = 0, sumGyBlue = 0; + + // Применяем свертку с ядрами Gx и Gy + for (int dy = -1; dy <= 1; dy++) { + for (int dx = -1; dx <= 1; dx++) { + int argb = reader.getArgb(x + dx, y + dy); + int r = (argb >> 16) & 0xFF; + int g = (argb >> 8) & 0xFF; + int b = argb & 0xFF; + + sumGxRed += r * gx[dy + 1][dx + 1]; + sumGxGreen += g * gx[dy + 1][dx + 1]; + sumGxBlue += b * gx[dy + 1][dx + 1]; + + sumGyRed += r * gy[dy + 1][dx + 1]; + sumGyGreen += g * gy[dy + 1][dx + 1]; + sumGyBlue += b * gy[dy + 1][dx + 1]; + } + } + + int gradientRed = (int) Math.sqrt(sumGxRed * sumGxRed + sumGyRed * sumGyRed); + int gradientGreen = (int) Math.sqrt(sumGxGreen * sumGxGreen + sumGyGreen * sumGyGreen); + int gradientBlue = (int) Math.sqrt(sumGxBlue * sumGxBlue + sumGyBlue * sumGyBlue); + + gradientRed = CheckBit(gradientRed, 0, 255); + gradientGreen = CheckBit(gradientGreen, 0, 255); + gradientBlue = CheckBit(gradientBlue, 0, 255); + + int a = (reader.getArgb(x, y) >> 24) & 0xFF; + + int newArgb = (a << 24) | (gradientRed << 16) | (gradientGreen << 8) | gradientBlue; + writer.setArgb(x, y, newArgb); + } + } + + imageView.setImage(Img); + System.out.println("Применен фильтр: " + log); + } } diff --git a/lab_1/src/main/java/org/example/lab_1/ImageEditorController.java b/lab_1/src/main/java/org/example/lab_1/ImageEditorController.java index e8713f2..fbfde20 100644 --- a/lab_1/src/main/java/org/example/lab_1/ImageEditorController.java +++ b/lab_1/src/main/java/org/example/lab_1/ImageEditorController.java @@ -12,6 +12,8 @@ import javafx.stage.Stage; import static org.example.lab_1.Helpers.Helpers.CheckBit; import static org.example.lab_1.Helpers.Helpers.NormolizeIdealOtr; import static org.example.lab_1.Helpers.Helpers.sortArray; +import static org.example.lab_1.Helpers.Helpers.MatrixFilter; +import static org.example.lab_1.Helpers.Helpers.DoubleMatrixFilter; public class ImageEditorController { @@ -441,7 +443,7 @@ public class ImageEditorController { progressBar.setVisible(false); } - public void applyMedianFilter() { + public void MedianFilter() { progressBar.setVisible(true); oldImg = imageView.getImage(); Image img = imageView.getImage(); @@ -494,4 +496,154 @@ public class ImageEditorController { progressBar.setVisible(false); } + public void EmbossFilter() { + progressBar.setVisible(true); + oldImg = imageView.getImage(); + double[][] kernel = { + {0, 1, 0}, + {1, 0, -1}, + {0, -1, 0} + }; + MatrixFilter(imageView, kernel, "Тиснение"); + progressBar.setVisible(false); + } + + public void goFilter() { + progressBar.setVisible(true); + oldImg = imageView.getImage(); + double[][] kernel = { + {1.0 / 3, 0, 0}, + {1.0 / 3, 0, 0}, + {1.0 / 3, 0, 0} + }; + MatrixFilter(imageView, kernel, "Размытие в Движении"); + progressBar.setVisible(false); + } + + public void RazshirFilter() { + progressBar.setVisible(true); + oldImg = imageView.getImage(); + Image img = imageView.getImage(); + if (img == null) { + return; + } + + int w = (int) img.getWidth(); + int h = (int) img.getHeight(); + + PixelReader reader = img.getPixelReader(); + WritableImage dilationImg = new WritableImage(w, h); + PixelWriter writer = dilationImg.getPixelWriter(); + + for (int y = 1; y < h - 1; y++) { + for (int x = 1; x < w - 1; x++) { + int maxRed = 0; + int maxGreen = 0; + int maxBlue = 0; + + for (int dy = -1; dy <= 1; dy++) { + for (int dx = -1; dx <= 1; dx++) { + int argb = reader.getArgb(x + dx, y + dy); + int r = (argb >> 16) & 0xFF; + int g = (argb >> 8) & 0xFF; + int b = argb & 0xFF; + + if (r > maxRed) maxRed = r; + if (g > maxGreen) maxGreen = g; + if (b > maxBlue) maxBlue = b; + } + } + + int a = (reader.getArgb(x, y) >> 24) & 0xFF; + + int newArgb = (a << 24) | (maxRed << 16) | (maxGreen << 8) | maxBlue; + writer.setArgb(x, y, newArgb); + } + } + + imageView.setImage(dilationImg); + System.out.println("Применен фильтр: Разширение"); + progressBar.setVisible(false); + } + + public void ErosionFilter() { + progressBar.setVisible(true); + oldImg = imageView.getImage(); + Image img = imageView.getImage(); + if (img == null) { + return; + } + + int w = (int) img.getWidth(); + int h = (int) img.getHeight(); + + PixelReader reader = img.getPixelReader(); + WritableImage erosionImg = new WritableImage(w, h); + PixelWriter writer = erosionImg.getPixelWriter(); + + for (int y = 1; y < h - 1; y++) { + for (int x = 1; x < w - 1; x++) { + int minRed = 255; + int minGreen = 255; + int minBlue = 255; + + for (int dy = -1; dy <= 1; dy++) { + for (int dx = -1; dx <= 1; dx++) { + int argb = reader.getArgb(x + dx, y + dy); + int r = (argb >> 16) & 0xFF; + int g = (argb >> 8) & 0xFF; + int b = argb & 0xFF; + + if (r < minRed) minRed = r; + if (g < minGreen) minGreen = g; + if (b < minBlue) minBlue = b; + } + } + + int a = (reader.getArgb(x, y) >> 24) & 0xFF; + + int newArgb = (a << 24) | (minRed << 16) | (minGreen << 8) | minBlue; + writer.setArgb(x, y, newArgb); + } + } + + imageView.setImage(erosionImg); + System.out.println("Применен фильтр: Сужение"); + progressBar.setVisible(false); + } + + public void SobelFilter() { + progressBar.setVisible(true); + oldImg = imageView.getImage(); + double[][] dx = { + {-1, 0, 1}, + {-2, 0, 2}, + {-1, 0, 1} + }; + + double[][] dy = { + {-1, -2, -1}, + {0, 0, 0}, + {1, 2, 1} + }; + DoubleMatrixFilter(imageView, dx, dy, "Фильтр Собеля"); + progressBar.setVisible(false); + } + + public void SharrFilter() { + progressBar.setVisible(true); + oldImg = imageView.getImage(); + double[][] dx = { + {3, 10, 3}, + {10, 0, -10}, + {-3, -10, -3} + }; + double[][] dy = { + {3, 0, -3}, + {10, 0, -10}, + {3, 0, -3} + }; + DoubleMatrixFilter(imageView, dx, dy, "Фильтр Щарра"); + progressBar.setVisible(false); + } } diff --git a/lab_1/src/main/resources/org/example/lab_1/main-view.fxml b/lab_1/src/main/resources/org/example/lab_1/main-view.fxml index a605b95..507ad06 100644 --- a/lab_1/src/main/resources/org/example/lab_1/main-view.fxml +++ b/lab_1/src/main/resources/org/example/lab_1/main-view.fxml @@ -25,15 +25,15 @@ - + - - - - - - + + + + + +