【问题标题】:java image processing sobel edge detectionjava图像处理sobel边缘检测
【发布时间】:2015-08-09 12:26:50
【问题描述】:

我在使用 java 程序时遇到问题,我在其中使用 sobel 运算符进行边缘检测,但是当我尝试使用该功能时,控制台显示:

线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 262144 在 sun.awt.image.ByteInterleavedRaster.getPixels(ByteInterleavedRaster.java:1015) 在 Obrazek.jButtonSobelActionPerformed(Obrazek.java:566)

代码如下:

FileInputStream inFile = null;   
        try {
            long beginTime = (new java.util.Date()).getTime();
            int i, j;
            double Gx[][], Gy[][], G[][];
            inFile = new FileInputStream("D://lenacsmall.bmp");
            BufferedImage bi = ImageIO.read(inFile);
            int width = bi.getWidth();
            int height = bi.getHeight();
            int[] pixels = new int[width * height];
            int[][] output = new int[width][height];
            int[] raster = bi.getRaster().getPixels(0,0,width,height,pixels); 
           
            int counter = 0;
            for(i = 0 ; i < width ; i++ )
            {
                for(j = 0 ; j < height ; j++ )
                {
                    output[i][j] = pixels[counter];
                    counter = counter + 1;
                }
            }   
            Gx = new double[width][height];
            Gy = new double[width][height];
            G  = new double[width][height];
            for (i=0; i<width; i++) {
                for (j=0; j<height; j++) {
                    if (i==0 || i==width-1 || j==0 || j==height-1)
                        Gx[i][j] = Gy[i][j] = G[i][j] = 0;
                    else{
                        Gx[i][j] = output[i+1][j-1] + 2*output[i+1][j] + output[i+1][j+1] -
                                output[i-1][j-1] - 2*output[i-1][j] - output[i-1][j+1];
                        Gy[i][j] = output[i-1][j+1] + 2*output[i][j+1] + output[i+1][j+1] -
                                output[i-1][j-1] - 2*output[i][j-1] - output[i+1][j-1];
                        G[i][j]  = Math.abs(Gx[i][j]) + Math.abs(Gy[i][j]);
                    }
                }
            }
            counter = 0;
            for(int ii = 0 ; ii < width ; ii++ )
            {
                for(int jj = 0 ; jj < height ; jj++ )
                {
                    pixels[counter] = (int) G[ii][jj];
                    counter = counter + 1;
                }
            }
            BufferedImage outImg = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
            outImg.getRaster().setPixels(0,0,width,height,pixels);
            FileOutputStream outFile = null;
            try {
                outFile = new FileOutputStream("D://copyTop.bmp");
            } catch (FileNotFoundException ex) {
                
            }
            try {
                ImageIO.write(outImg,"BMP",outFile);
            } catch (IOException ex) {
                
            }
            JFrame TheFrame = new JFrame("obrazek " + width + " " + height);
            JLabel TheLabel = new JLabel(new ImageIcon(outImg));
            TheFrame.getContentPane().add(TheLabel);
            TheFrame.setSize(600, 600);
            TheFrame.addWindowListener(new WindowAdapter() {   
          public void windowClosing(WindowEvent e) {   
            System.exit(0);                 
          }   
        });
            TheFrame.setVisible(true);   
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Obrazek.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Obrazek.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                inFile.close();
            } catch (IOException ex) {
                Logger.getLogger(Obrazek.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

我真的需要一些帮助。我希望有人能回答那个帖子,谢谢。
问候:)

【问题讨论】:

    标签: java image-processing edge-detection sobel


    【解决方案1】:

    试试这个,使用sobel方法进行边缘检测,我昨天才这样做。

    `

    static BufferedImage inputImg,outputImg;
    static int[][] pixelMatrix=new int[3][3];
    
    public static void main(String[] args) {
        try {
    
            inputImg=ImageIO.read(new File("your input image"));
            outputImg=new BufferedImage(inputImg.getWidth(),inputImg.getHeight(),TYPE_INT_RGB);
    
            for(int i=1;i<inputImg.getWidth()-1;i++){
                for(int j=1;j<inputImg.getHeight()-1;j++){
                    pixelMatrix[0][0]=new Color(inputImg.getRGB(i-1,j-1)).getRed();
                    pixelMatrix[0][1]=new Color(inputImg.getRGB(i-1,j)).getRed();
                    pixelMatrix[0][2]=new Color(inputImg.getRGB(i-1,j+1)).getRed();
                    pixelMatrix[1][0]=new Color(inputImg.getRGB(i,j-1)).getRed();
                    pixelMatrix[1][2]=new Color(inputImg.getRGB(i,j+1)).getRed();
                    pixelMatrix[2][0]=new Color(inputImg.getRGB(i+1,j-1)).getRed();
                    pixelMatrix[2][1]=new Color(inputImg.getRGB(i+1,j)).getRed();
                    pixelMatrix[2][2]=new Color(inputImg.getRGB(i+1,j+1)).getRed();
    
                    int edge=(int) convolution(pixelMatrix);
                    outputImg.setRGB(i,j,(edge<<16 | edge<<8 | edge));
                }
            }
    
            File outputfile = new File("your output image");
            ImageIO.write(outputImg,"jpg", outputfile);
    
        } catch (IOException ex) {System.err.println("Image width:height="+inputImg.getWidth()+":"+inputImg.getHeight());}
    }
    public static double convolution(int[][] pixelMatrix){
    
        int gy=(pixelMatrix[0][0]*-1)+(pixelMatrix[0][1]*-2)+(pixelMatrix[0][2]*-1)+(pixelMatrix[2][0])+(pixelMatrix[2][1]*2)+(pixelMatrix[2][2]*1);
        int gx=(pixelMatrix[0][0])+(pixelMatrix[0][2]*-1)+(pixelMatrix[1][0]*2)+(pixelMatrix[1][2]*-2)+(pixelMatrix[2][0])+(pixelMatrix[2][2]*-1);
        return Math.sqrt(Math.pow(gy,2)+Math.pow(gx,2));
    
    }
    

    `

    【讨论】:

    • 非常感谢,帮了大忙。两个答案都很有帮助,所以谢谢你们:)
    • 哦,如果我可以请更多帮助。我真的对快速傅里叶变换感到困惑。我不知道如何开始。我看到很多例子,但我不知道如何在我的程序中使用它,因为我有一个带有按钮的程序。你也可以帮我吗?
    • 我不熟悉fft,但是这里有一个来自普林斯顿introcs.cs.princeton.edu/java/97data/FFT.java.html的很好的java示例@希望对您有所帮助:)
    • 好的,谢谢。你知道带通滤波器吗?
    • 害怕不,娜塔莉亚,我对 dsp 很陌生,抱歉不能让你更进一步
    【解决方案2】:

    检查时在 for 循环中

    if (i==0 || i==width-1 || j==0 || j==height-1)
    

    您可能应该检查 i >= width-2 而不是 i==width-1。

    例如,如果宽度为 10,则它属于 if i == 9 的语句。 如果 i == 8,您想捕获,因为您稍后会检查 [i+1],因为您可以拥有的最大值为 9(宽度-1),因此您的代码中的 [i+1] 超出了图像数组的范围。

    显然这同样适用于 j。

    【讨论】:

    • 哦,Java 编程 :) 小事可以毁掉所有程序。谢谢你的帮助:)
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多