java - 模糊 Java 缓冲图像

标签 java filtering bufferedimage

我想在 Java 中模糊缓冲图像,而不需要特殊的“模糊 api”。 现在我找到了这个 page并编写这段代码:

 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;

}

int 矩阵来自这个方法:

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

但是它想要工作,怎么了?

谢谢!

更新

问题是,结果不是应该的。 当我有这个模糊矩阵时:

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 当我有这个模糊矩阵时:

float[] blurmatrix = {
    0.111f, 0.111f, 0.111f, 
    0.111f, 0.111f, 0.111f, 
    0.111f, 0.111f, 0.111f, 
};

图片已删除。

最佳答案

您的矩阵似乎有误。通常这些矩阵中所有数字的总和为 1。您的矩阵可能会使所有内容变白。

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

Edit2:您的代码有很多错误。

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

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

另一个错误是您将源图像中的像素一个一个地填充到目标中,这是行不通的,因为您需要尚未填充的相邻像素。

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

[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], [x+1] [y+1] 并将它们与过滤器值相乘(在您的情况下,每个值都是 0.111),将它们相加并将像素保存到新图像中。

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

关于java - 模糊 Java 缓冲图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19046625/

相关文章:

php - 无法在 codeigniter 中按类别过滤数据

java - 将 float 组转换为图像

java - Java 运行时中的链接是否总是动态完成的?

java - 如何销毁对象本身

asp.net-mvc - Asp.net Mvc 2 : Repository, 分页和过滤如何?

java - 为什么我的图像不旋转?

java - 在 Java 中旋转 BufferedImage

java - Java中静态方法中调用非静态方法(非静态变量错误)

java - 如何检查 mule 中的入站 header "content-type"响应?

python - 内存不足过滤 Pandas 中的 HDF5 表