取引は次のとおりです。畳み込みの実行方法を(ユーザーに)単純化しようとしました。これを使用して Sobel フィルターを実行しようとしましたが、(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;
}
コードが更新されました
次のようにすると、GUI は画像のないプレーン グレーのフレームを表示します。1 つのコマンドを実行し、他のコマンドを実行しない場合、画像は完全に表示されます。BufferedImage testImage = ImageIO.read(ファイルパス);
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 画面が表示されます。それらが実行される順序を入れ替えると(最初にフィルタしてからグレースケールに変換する)、結果が得られます。
グレースケール変換プロセスの何かが畳み込みを台無しにしていると思います
toGrayscale は画像をグレースケールに変換する必要があります
convolutionFilter は 2D 画像フィルターを取得し、それを 1D 配列に展開してから、processedImage を畳み込み、結果を返す必要があります。
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;
}
}