Added all Matrix filters
This commit is contained in:
parent
f671d526f0
commit
65aeef7f2b
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user