1

取引は次のとおりです。畳み込みの実行方法を(ユーザーに)単純化しようとしました。これを使用して 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; 

    } 
 } 
4

1 に答える 1

3

入力画像が何であるかがわからないため、画像コンストラクターに指定したimageType( BufferedImage.TYPE_INT_ARGB) 引数に矛盾がある可能性があります。temp次の場合、宛先イメージを提供する必要はありません。

op.filter(processedImage, temp);

ConvolveOp.filter()によって返された画像を使用できます。次のことを試してください。

public BufferedImage convolutionFilter(float[][] filter, BufferedImage processedImage) {
...
Kernel kern = new Kernel(rows, columns, filter1D);
ConvolveOp op = new ConvolveOp(kern);
BufferedImage temp = op.filter( processedImage, null );
return temp;
}

次に、結果のイメージが source で作成されますColorModel

toGrayscale() 導入後の編集

toGrayScale/convolutionFilter の組み合わせで発生している問題を再現できませんでした。更新された両方の方法を使用して、正しい結果が得られています。使用している画像を共有できる可能性はありますか?

編集 :

このコードは、前述の画像に対して機能します。

public static void main(String args[]) {
    try {
        BufferedImage image = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));
        image = SimpleImage.toGrayscale(image);
        image = SimpleImage.convolutionFilter(image, sobel);
        JOptionPane.showMessageDialog(null, "", "", JOptionPane.INFORMATION_MESSAGE, new ImageIcon( image ));
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage(), "Failure", JOptionPane.ERROR_MESSAGE);
        e.printStackTrace();
    } 
  } 

また、言及された画像のタイプはTYPE_3BYTE_BGR. これにより、 の適切な動作が妨げられる可能性がありConvolveOpます。ここにバグがあります。Java 7でのみ修正されたようです。

また、とtempImageの実装における の初期割り当ては冗長であることに注意してください。toGrayscale()convolutionFilter()

于 2012-03-14T22:51:24.323 に答える