Так вот в чем дело: я попытался упростить (для пользователя), как выполнить свертку. Я попытался использовать это, чтобы запустить фильтр Собеля, и когда я пытаюсь отобразить изображение (через jfram и значок изображения), значок изображения не появляется, это просто большой серый квадрат.
Jframe / imageicon работал безупречно, пока я не попытался заставить его отобразить вывод результата этого фильтра.
float[][] sobel = { { -1, 0, 1},
{ -2, 0, 2},
{-1, 0, 1} };
someObject test = new someObject(filepath);
test.convolutionFilter(sobel);
public BufferedImage convolutionFilter(float[][] filter) {
int columns = filter.length;
int rows= filter[0].length;
float numTemp;
float[] filter1D = new float[columns*rows];
for (int j = 0; j<rows; j++) {
for (int i= 0; i< columns; i++ ) {
numTemp = filter[j][i];
System.out.print(numTemp + " ");
filter1D[j*columns + i] = numTemp;
}
}
Kernel kern = new Kernel(rows, columns, filter1D);
ConvolveOp op = new ConvolveOp(kern);
BufferedImage temp = new BufferedImage(processedImage.getWidth(), processedImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
op.filter(processedImage, temp);
processedImage = temp;
return processedImage;
}
КОД ОБНОВЛЕН
Если я сделаю следующее, мой графический интерфейс покажет плоскую серую рамку без изображения. Если я сделаю одну команду, а не другую, изображение будет отображаться идеально.
BufferedImage testImage = ImageIO.read (filepath);
float[][] sobelFilter = { { -1, 0, 1},
{ -2, 0, 2},
{ -1, 0, 1} };
testImage = SimpleImage.toGrayscale(testImage);
testImage = SimpleImage.convolutionFilter(testImage, sobelFilter);
//use some swing functions to display image
Если я ПРОСТО преобразовал в оттенки серого, я получу правильные результаты, если я просто применю ПРОСТО фильтр, я получу правильные результаты. Если я завершу это как есть, я получу пустой экран GUI, который всплывает. Если я поменяю местами порядок их выполнения (сначала отфильтруйте, затем преобразуйте в оттенки серого), я получу результаты.
Я думаю, что что-то с процессом преобразования в градациях серого приводит к испорчению свертки
в градациях серого следует преобразовать изображение в градации серого
convolutionFilter должен взять фильтр 2D-изображения, развернуть его в массив 1D, а затем свернуть обработанный образ и вернуть результат.
public class SimpleImage {
public static BufferedImage toGrayscale(BufferedImage processedImage) {
BufferedImage tempImage = new BufferedImage(processedImage.getWidth(), processedImage.getHeight(), processedImage.getType());
BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
tempImage = op.filter(processedImage, null);
return tempImage;
}
public static BufferedImage convolutionFilter(BufferedImage processedImage, float[][] filter2D) {
BufferedImage tempImage = new BufferedImage(processedImage.getWidth(), processedImage.getHeight(), processedImage.getType());
int columns = filter2D.length;
int rows= filter2D[0].length;
//Unrolls a 2D filter into a 1D filter
float[] filter1D = new float[columns*rows];
for (int j = 0; j<rows; j++) {
for (int i= 0; i< columns; i++ ) {
filter1D[j*columns + i] = filter2D[j][i];
}
}
//creates Kernal and convolution operator
Kernel kern = new Kernel(rows, columns, filter1D);
ConvolveOp op = new ConvolveOp(kern);
//apply filtering
tempImage = op.filter(processedImage, null);
return tempImage;
}
}