writableraster中的负值

时间:2014-10-26 16:36:18

标签: java image-processing bufferedimage raster

我正在尝试使用不同大小的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 个答案:

答案 0 :(得分:0)

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

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

您应该考虑未使用变量resultfadd。如果value类型为double而不是int,情况会更好。在最坏的情况下,您将得到值为11的25倍,在乘以1/25后将四舍五入为零。这将导致您的代码为灰色值为零,而它应该导致11。