В настоящее время я пытаюсь реализовать свою собственную версию Sobel-Filter / Operator. Я попытался извлечь как можно больше информации из Википедии (https://en.wikipedia.org/wiki/Sobel_operator) и многочисленных объяснений на YouTube, но не могу найти решение своей проблемы.
Итак, после серого - Масштабирование моего изображения:
public BufferedImage grayscale(String path) {
BufferedImage img = readImage(path);
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
Color oldColor = new Color(img.getRGB(x, y));
int red = oldColor.getRed();
int green = oldColor.getGreen();
int blue = oldColor.getBlue();
int grayValue = (int) (0.244 * red + 0.587 * green + 0.114 * blue);
Color newColor = new Color(grayValue, grayValue, grayValue);
img.setRGB(x, y, newColor.getRGB());
}
}
return img;
}
Я попытался извлечь часть изображения, которая должна быть свернута с помощью оператора Собеля Sx. Поскольку я масштабировал все изображение серым, я решил, что использовать красную часть будет нормально, поскольку все значения должны быть одинаковыми:
public void sobel(BufferedImage grayScaledImg) {
for (int x = 1; x < grayScaledImg.getWidth() - 1; x++) {
for (int y = 1; y < grayScaledImg.getHeight() - 1; y++) {
int field1 = new Color(grayScaledImg.getRGB(x - 1, y - 1)).getRed();
int field2 = new Color(grayScaledImg.getRGB(x, y - 1)).getRed();
int field3 = new Color(grayScaledImg.getRGB(x + 1, y - 1)).getRed();
int field4 = new Color(grayScaledImg.getRGB(x - 1, y)).getRed();
int field5 = new Color(grayScaledImg.getRGB(x, y)).getRed();
int field6 = new Color(grayScaledImg.getRGB(x + 1, y)).getRed();
int field7 = new Color(grayScaledImg.getRGB(x - 1, y + 1)).getRed();
int field8 = new Color(grayScaledImg.getRGB(x, y + 1)).getRed();
int field9 = new Color(grayScaledImg.getRGB(x + 1, y + 1)).getRed();
int[] currentPartOfImage = {field1, field2, field3, field4, field5, field6, field7, field8, field9};
И я почти уверен, что в следующем фрагменте code Я сделал что-то не так, но не могу понять, что ..
int newGrayScale = sobelX(currentPartOfImage);
grayScaledImg.setRGB(x, y, new Color(newGrayScale, newGrayScale, newGrayScale).getRGB());
}
}
}
Функция sobelX выглядит так:
public int sobelX(int[] image) {
return Math.abs(image[2] + (2 * image[5]) + image[8] - image[0] - (2 * image[3]) - image[6]);
}
Проблема Некоторые из значений, которые я получаю при выполнении свертки, больше 255, что означает, что они не являются действительными значениями RGB. Так что я в настоящее время не уверен, как правильно использовать эти значения?
Заранее благодарим за помощь! :)