有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

可写光栅中的java负值

我正在尝试用不同尺寸的3x3、5x5、7x7和11x11实现平均滤波器。。我在调试时做了计算,结果是正确的,但问题是它以负数保存在可写光栅中,所以我得到了奇怪的结果。第二件奇怪的事情是,当我想要得到以负数保存的同一像素的值时,它会以正数进行检索!! 我用的是int。 发生了什么?有人帮忙吗

这是我的5x5平均滤波器代码

   public static BufferedImage filter5x5_2D(BufferedImage paddedBI , BufferedImage bi , double[][]filter)
{

    WritableRaster myImage = paddedBI.copyData(null);
    BufferedImage img = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
    WritableRaster myImage2 = img.copyData(null);

    for(int i =2; i< myImage.getHeight()-2; i++)
        {
            for(int j =2; j< myImage.getWidth()-2; j++)
            {
                int value = 0;
                int copyi = i-2;
                for (int m = 0 ; m<5 ;  m++)
                {   
                    int copyj = j-2;
                    for (int n = 0; n<5; n++)
                    {
                        int result = myImage.getSample(copyj , copyi, 0);
                        double f = filter[m][n];
                        double add = result * filter[m][n];
                        value += (int) (filter[m][n] * myImage.getSample(copyj , copyi, 0));    
                        copyj ++;
                    }
                    copyi++;
                    //myImage2.setSample(j-1 , i-1, 0, value);
                }

                myImage2.setSample(j-2 , i-2, 0, value);
                //int checkResult = myImage2.getSample(j-1,i-1,0);
            }       
        }
    BufferedImage res= new BufferedImage(bi.getWidth(),bi.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
    res.setData(myImage2);
    return res;
}

共 (1) 个答案

  1. # 1 楼答案

    我没有发现任何负值。以下是我测试这段代码的主要内容:

    public static void main(String[] args) throws IOException {
        BufferedImage bi = ImageIO.read(new File("C:/Tmp/test.bmp")); 
    
        BufferedImage newImage = new BufferedImage(bi.getWidth()+4, bi.getHeight()+4, bi.getType());
    
        Graphics g = newImage.getGraphics();
    
        g.setColor(Color.white);
        g.fillRect(0,0,bi.getWidth()+4,bi.getHeight()+4);
        g.drawImage(bi, 2, 2, null);
        g.dispose();
    
        double[][] filter = new double[5][5];
        for( int i = 0; i < 5; ++i){
            for( int j = 0; j < 5; ++j){
                filter[i][j] = 1.0/(5*5);
            }
        }
        BufferedImage filtered = filter5x5_2D(newImage, bi, filter);
        ImageIO.write(filtered, "bmp", new File("C:/tmp/filtered.bmp"));
    }
    

    你应该考虑你的变量^ {< CD1>},^ {< CD2>}和^ {< CD3>}未被使用。如果valuedouble型而不是int型,也会更好。在最坏的情况下,你会得到一个值11的25倍,在乘以1/25后,这个值将被四舍五入为零。这将导致代码的灰色值为零,而它将导致11