Java图像卷积 [英] java image convolution

查看:788
本文介绍了Java图像卷积的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图平滑滤波器应用到图像。但我得到这个错误:

  java.awt.image.ImagingOpException:无法卷积SRC形象
在java.awt.image.ConvolveOp.filter(ConvolveOp.java:180)
在ocr.Resolution.smoothi​​ng(Resolution.java:102)
在ocr.Interface $ ButtonListener.actionPerformed(Interface.java:332)
在javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
在javax.swing.AbstractButton中的$ Handler.actionPerformed(AbstractButton.java:2318)
在javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
在javax.swing.DefaultButtonModel.set pressed(DefaultButtonModel.java:242)
在javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
在java.awt.Component.processMouseEvent(Component.java:6038)
在javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
在java.awt.Component.processEvent(Component.java:5803)
在java.awt.Container.processEvent(Container.java:2058)
在java.awt.Component.dispatchEventImpl(Component.java:4410)
在java.awt.Container.dispatchEventImpl(Container.java:2116)
在java.awt.Component.dispatchEvent(Component.java:4240)
在java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
在java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
在java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
在java.awt.Container.dispatchEventImpl(Container.java:2102)

我已经研究,但找不到任何确切的解决方案。要看到问题的根源,我有负载图像作为图标。他们都OK。这个问题的原因可能是该图像是后加载,因此它不能应用过滤器?

另外,我会申请细化算法和一些其他的过滤器了。你觉得如果是更好地处理,而不是java做。感谢您的任何帮助。

 过滤器=新的浮动[] {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;
    图片IMG;    IMG = Toolkit.getDefaultToolkit()的getImage(Interface.picPath)。 //加载图像
    IMAGESIZE大小=新IMAGESIZE(IMG); //实例来获得图像的尺寸
    bufImg =新的BufferedImage(size.getwidth(),size.getheight(),BufferedImage.TYPE_INT_RGB);
    尝试{
    bufImg = ImageIO.read(新文件(Interface.picPath));    }赶上(IOException异常前){
    。Logger.getLogger(Resolution.class.getName())日志(Level.SEVERE,空,前);
    }    内核=新的内核(kernelWidth,kernelHeight,过滤器);
    bufOp =新的ConvolveOp(内核);
    bufImg = bufOp.filter(bufImg,NULL);


解决方案

我已经找到了解决办法。而不是创建的BufferedImage(bufImg)使用URL的,我转换图像本身(IMG),以BufferedImage的,它现在运行。

 公共无效平滑(){
     过滤器=新的浮动[] {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;
    内核=新的内核(kernelWidth,kernelHeight,过滤器);
    OP =新的ConvolveOp(内核);    IMG = Toolkit.getDefaultToolkit()的getImage(Interface.picPath)。
    imageToBufferedImage(IMG);
    bufImg = op.filter(bufImg,NULL);    图标=新的ImageIcon(img.getScaledInstance(175,175,Image.SCALE_DEFAULT));
    图标2 =新的ImageIcon(img.getScaledInstance(300,300,Image.SCALE_DEFAULT));
    Interface.label3.setIcon(图标);
    Interface.label8.setIcon(图标2);}公共无效imageToBufferedImage(像IM){
    IMAGESIZE大小=新IMAGESIZE(IM);
    bufImg =新的BufferedImage(size.getwidth(),size.getheight(),BufferedImage.TYPE_INT_RGB);
    图形图表= bufImg.getGraphics();
    graph.drawImage(1M,0,0,NULL);
    graph.dispose();

}

I am trying to apply smoothing filter to image . But I get this bug :

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)

I have researched but couldn't find any exact solution. To see the source of problem , I have load images as icon . They are ok. Can the reason of this problem be that the image is loading later , so it couldn't apply the filter ?

Also , I will apply thinning algorithm and some other filters too. Do you think If it is better to do in Processing instead of Java. Thank you for any help.

        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);

解决方案

I have found a solution. Instead of creating BufferedImage(bufImg) using URl, I converted the image itself (img ) to BufferedImage and it runs now.

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图像卷积的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆