java图像卷积

java图像卷积,java,awt,Java,Awt,我正在尝试对图像应用平滑过滤器。但我有一个错误: java.awt.image.ImagingOpException: Unable to convolve src image at java.awt.image.ConvolveOp.filter(ConvolveOp.java:180) at ocr.Resolution.smoothing(Resolution.java:102) at ocr.Interface$ButtonListener.actionPerformed(Interfa

我正在尝试对图像应用平滑过滤器。但我有一个错误:

java.awt.image.ImagingOpException: Unable to convolve src image
at java.awt.image.ConvolveOp.filter(ConvolveOp.java:180)
at ocr.Resolution.smoothing(Resolution.java:102)
at ocr.Interface$ButtonListener.actionPerformed(Interface.java:332)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
我已经研究过了,但找不到确切的解决办法。为了查看问题的根源,我将图像加载为图标。他们很好。此问题的原因可能是图像加载较晚,因此无法应用过滤器

此外,我还将应用细化算法和其他一些过滤器。您是否认为在处理过程中而不是在Java中进行比较好。谢谢你的帮助

        filter = new float[] { 1.0f/121.0f,  2.0f/121.0f,   3.0f/121.0f,   2.0f/121.0f,   1.0f/121.0f,
                            2.0f/121.0f,  7.0f/121.0f,  11.0f/121.0f,   7.0f/121.0f,   2.0f/121.0f,
                            3.0f/121.0f, 11.0f/121.0f,  17.0f/121.0f,  11.0f/121.0f,   3.0f/121.0f,
                            2.0f/121.0f,  7.0f/121.0f,  11.0f/121.0f,   7.0f/121.0f,   2.0f/121.0f,
                            1.0f/121.0f,  2.0f/121.0f,   3.0f/121.0f,   2.0f/121.0f,   1.0f/121.0f};
    kernelWidth = 5;
    kernelHeight = 5;
    BufferedImageOp bufOp ;
    BufferedImage bufImg;
    Image img;

    img = Toolkit.getDefaultToolkit().getImage(Interface.picPath); //load image        
    ImageSize size = new ImageSize(img);// instance to get image dimensions
    bufImg = new BufferedImage (size.getwidth(),size.getheight(),BufferedImage.TYPE_INT_RGB); 
    try {
    bufImg = ImageIO.read(new File(Interface.picPath) );

    } catch (IOException ex) {
    Logger.getLogger(Resolution.class.getName()).log(Level.SEVERE, null, ex);
    }

    kernel = new Kernel( kernelWidth, kernelHeight, filter);
    bufOp = new ConvolveOp(kernel); 
    bufImg = bufOp.filter(bufImg, null);

我找到了解决办法。我没有使用URl创建BuffereImage(bufImg),而是将映像本身(img)转换为BuffereImage,它现在运行

public void smoothing(){
     filter = new float[] { 1.0f/121.0f,  2.0f/121.0f,   3.0f/121.0f,   2.0f/121.0f,   1.0f/121.0f,
                            2.0f/121.0f,  7.0f/121.0f,  11.0f/121.0f,   7.0f/121.0f,   2.0f/121.0f,
                            3.0f/121.0f, 11.0f/121.0f,  17.0f/121.0f,  11.0f/121.0f,   3.0f/121.0f,
                            2.0f/121.0f,  7.0f/121.0f,  11.0f/121.0f,   7.0f/121.0f,   2.0f/121.0f,
                            1.0f/121.0f,  2.0f/121.0f,   3.0f/121.0f,   2.0f/121.0f,   1.0f/121.0f};
    kernelWidth = 5;
    kernelHeight = 5;
    kernel = new Kernel( kernelWidth, kernelHeight, filter);
    op = new ConvolveOp(kernel); 

    img = Toolkit.getDefaultToolkit().getImage(Interface.picPath);
    imageToBufferedImage(img);
    bufImg = op.filter(bufImg, null);

    icon = new ImageIcon(img.getScaledInstance(175, 175, Image.SCALE_DEFAULT));
    icon2 = new ImageIcon(img.getScaledInstance(300, 300, Image.SCALE_DEFAULT));
    Interface.label3.setIcon(icon);
    Interface.label8.setIcon(icon2);

}

public  void imageToBufferedImage(Image im) {
    ImageSize size = new ImageSize(im);
    bufImg = new BufferedImage (size.getwidth(), size.getheight(),BufferedImage.TYPE_INT_RGB);
    Graphics graph = bufImg.getGraphics();
    graph.drawImage(im, 0, 0, null);
    graph.dispose();

}我找到了一个解决办法。我没有使用URl创建BuffereImage(bufImg),而是将映像本身(img)转换为BuffereImage,它现在运行

public void smoothing(){
     filter = new float[] { 1.0f/121.0f,  2.0f/121.0f,   3.0f/121.0f,   2.0f/121.0f,   1.0f/121.0f,
                            2.0f/121.0f,  7.0f/121.0f,  11.0f/121.0f,   7.0f/121.0f,   2.0f/121.0f,
                            3.0f/121.0f, 11.0f/121.0f,  17.0f/121.0f,  11.0f/121.0f,   3.0f/121.0f,
                            2.0f/121.0f,  7.0f/121.0f,  11.0f/121.0f,   7.0f/121.0f,   2.0f/121.0f,
                            1.0f/121.0f,  2.0f/121.0f,   3.0f/121.0f,   2.0f/121.0f,   1.0f/121.0f};
    kernelWidth = 5;
    kernelHeight = 5;
    kernel = new Kernel( kernelWidth, kernelHeight, filter);
    op = new ConvolveOp(kernel); 

    img = Toolkit.getDefaultToolkit().getImage(Interface.picPath);
    imageToBufferedImage(img);
    bufImg = op.filter(bufImg, null);

    icon = new ImageIcon(img.getScaledInstance(175, 175, Image.SCALE_DEFAULT));
    icon2 = new ImageIcon(img.getScaledInstance(300, 300, Image.SCALE_DEFAULT));
    Interface.label3.setIcon(icon);
    Interface.label8.setIcon(icon2);

}

public  void imageToBufferedImage(Image im) {
    ImageSize size = new ImageSize(im);
    bufImg = new BufferedImage (size.getwidth(), size.getheight(),BufferedImage.TYPE_INT_RGB);
    Graphics graph = bufImg.getGraphics();
    graph.drawImage(im, 0, 0, null);
    graph.dispose();
}

我刚刚遇到了“相同”的错误,并深入研究了源代码以找出错误所在。 我以读书而告终

如您所见,方法Java\u sun\u awt\u image\u ImagingLib\u convolveRaster有十几种方法返回0或-1(实际上有13种方法)

每当该方法返回非正的内容时,这个案例就以异常Ecrin posted结束,并且没有具体的错误信息,因为该方法一开始没有提供任何信息

你能做的最好的事情就是从一个有效的例子开始,就像Ecrin提供的那样,希望它对你也有效。然后一步一步地修改它。

我刚刚遇到了“相同”的错误,并深入研究了源代码以找出错误所在。 我以读书而告终

如您所见,方法Java\u sun\u awt\u image\u ImagingLib\u convolveRaster有十几种方法返回0或-1(实际上有13种方法)

每当该方法返回非正的内容时,这个案例就以异常Ecrin posted结束,并且没有具体的错误信息,因为该方法一开始没有提供任何信息

你能做的最好的事情就是从一个有效的例子开始,就像Ecrin提供的那样,希望它对你也有效。然后一步一步地改变它