Added all Matrix filters

This commit is contained in:
Remizov Kirirll 2025-03-17 18:05:05 +03:00
parent f671d526f0
commit 65aeef7f2b
3 changed files with 266 additions and 8 deletions

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -25,15 +25,15 @@
<MenuItem text="Серый мир" onAction="#grayWorld"/>
<MenuItem text="Автоуровни" onAction="#autoLevels"/>
<MenuItem text="Идеальный отражатель" onAction="#IDdealOtr" />
<MenuItem text="Медиана" onAction="#applyMedianFilter"/>
<MenuItem text="Медиана" onAction="#MedianFilter"/>
</Menu>
<Menu text="Матричные">
<MenuItem text="Тиснение" />
<MenuItem text="Разматие в движении" />
<MenuItem text="Разширение" />
<MenuItem text="Сужение" />
<MenuItem text="Фильтр Собеля" />
<MenuItem text="Фильтр Щарра" />
<MenuItem text="Тиснение" onAction="#EmbossFilter"/>
<MenuItem text="Разматие в движении" onAction="#goFilter" />
<MenuItem text="Разширение" onAction="#RazshirFilter" />
<MenuItem text="Сужение" onAction="#ErosionFilter"/>
<MenuItem text="Фильтр Собеля" onAction="#SobelFilter" />
<MenuItem text="Фильтр Щарра" onAction="#SharrFilter"/>
</Menu>
</Menu>
</MenuBar>