模糊Java bufferedimage

问题描述 投票:1回答:3

我想在Java中模糊bufferedimage,没有特殊的“模糊api”。现在我找到了这个qazxsw poi并写下这段代码:

page

int矩阵来自这个方法:

 public int[][] filter(int[][] matrix)
{
   float[] blurmatrix = {
    0.111f, 0.111f, 0.111f, 
    0.111f, 0.111f, 0.111f, 
    0.111f, 0.111f, 0.111f, 
};

   int[][] returnMatrix = new int[matrix.length][matrix[0].length];

   for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[0].length; j++) {
            returnMatrix[i][j]=matrix[i][j];
           for(int k=0;k<blurmatrix.length;k++)
           {
               float blurPixel= blurmatrix[k];
               int newPixel= (int) (returnMatrix[i][j]*blurPixel);
               returnMatrix[i][j]= newPixel;
           }
        }
    }
    return returnMatrix;

}

但它想要工作,有什么不对?

谢谢!

UPDATE

问题是,结果不是它应该是什么。当我有这个蓝色矩阵时:

 public int[][] getMatrixOfImage(BufferedImage bufferedImage) {
    int width = bufferedImage.getWidth(null);
    int height = bufferedImage.getHeight(null);
    int[][] retrunMatrix = new int[width][height];
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            retrunMatrix[i][j] = bufferedImage.getRGB(i, j);
        }
    }

    return retrunMatrix;
}

我得到这个结果:当我有这个blurmatrix时float[] blurmatrix = { 10.111f, 0.111f, 0.111f, 0.111f, 50.111f, 0.111f, 0.111f, 0.111f, 10.111f, };

http://img854.imageshack.us/img854/541/2qw7.png

图片被删除了。

java filtering bufferedimage
3个回答
3
投票

你的矩阵似乎错了。通常,这些矩阵中所有数字的总和为1.您的矩阵可能会使一切都变白。

编辑:我看到你纠正了矩阵。

编辑2:你的代码有很多错误。

您的方法getMatrixOfImage返回32位RGB或RGBA值的数组。您将这些值与过滤器值相乘。那是不对的。这种乘法使一种颜色的值溢出到其他颜色。您需要分别乘以R,G和B值。

你最内层的循环(带有k索引的循环)是完全错误的。你取一个像素并将它乘以0.111九次。您需要做的是在每个像素周围采用3x3像素的正方形,将每个像素乘以该像素的滤波器值,将它们相加,然后将它们保存为此像素。

另一个错误的事情是你将源图像中的像素逐个填充到目标中,这种方式不起作用,因为你需要相邻的像素尚未填充。

您的函数需要创建一个与源图像大小相同的新图像数组。然后它需要遍历目标图像并获取每个像素,例如:

将源图像中的像素放在位置float[] blurmatrix = { 0.111f, 0.111f, 0.111f, 0.111f, 0.111f, 0.111f, 0.111f, 0.111f, 0.111f, }; [x-1][y-1][x][y-1][x+1][y-1][x-1][y][x][y][x+1][y][x-1][y+1][x][y+1]中,并将它们与滤波器值相乘(在您的情况下,每个都为0.111),将它们相加并将像素保存到新形象。

请注意,您需要分别对每种颜色执行此操作(使用二进制AND操作和位移以获取每个颜色值)。您还需要考虑边缘,其中[x+1][y+1]像素可能不存在。您可以替换值0或使用[x-1][y-1]


2
投票

你没有正确地做[x][y]。您需要将convolution处的像素设置为其周围像素的平均值。这就是(i,j)的意思。卷积运算会将像素的所有邻居平均为单个值并设置中心像素的值:

1/9 = 0.111f

0
投票

该算法利用内核对bufferedImage的图像矩阵进行了转换。不同的内核可以用于不同的目的。

希望能帮助到你

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i-1, j-1)));
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i-1, j)));
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i-1, j+1)));
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i  , j-1)));
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i  , j)));
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i  , j+1)));
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i+1, j-1)));
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i+1, j)));
         returnMatrix[i][j] += (int)( 0.111f * get(returnMatrix, i+1, j+1)));
    }
}

int get(int[][]m, int i, int j) {
   if(i >= 0 && i < m.length && j >= 0 && j <= m[i].length) {
       return m[i][j];
   }
   return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.