2013-09-27 88 views
1

我想模糊Java中的缓冲图像,没有特殊的“模糊api”。 现在,我发现这个page和编写代码:模糊Java缓冲图像

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; 

} 

整型矩阵来自这个方法:

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

但想工作,有什么不好?

谢谢!

UPDATE

的proble是,结果是不应该的。 当我有这个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 当我有这个blurmatrix:

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

图片被删除。

+1

什么是 “行不通”?例外?意外的结果?结果与您期望的结果相比如何? ... – Fildor

+0

对不起,我已更新问题 – Laren0815

回答

3

你的矩阵看起来不对。一般来说,这些矩阵中所有数字的总和为1.您的矩阵可能会使一切变白。

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

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

您的方法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]

+0

是的,图片被删除;) – Laren0815

2

你无法正确做convolution。您需要将像素设置为(i,j)为其所有周围像素的平均值。这就是1/9 = 0.111f的意思。卷积运算将平均的像素的所有邻居成一个单一的值,并设置中心像素的那个值:

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

仍然不会因为颜色工作。 –

+0

@UM那么这需要按照R,G和B来完成。由OP来为不同的通道编写额外的循环。这就是你如何进行矩阵的卷积,以及需要进行多少个矩阵(不同颜色分量)的卷积是由用户决定的。 – cyon

0

该算法实现使用kernel.Different内核BufferedImage的图像矩阵convloution可用于不同的目的。

希望它可以帮助

import java.awt.Color; 
import javax.imageio.ImageIO; 
import java.io.*; 
import java.awt.image.BufferedImage; 


class psp { 

    public static void main(String[] args) { 
try 
{ 


File input=new File("abc.jpg"); 
File output=new File("output1.jpg"); 
     BufferedImage picture1 = ImageIO.read(input); // original 
BufferedImage picture2= new BufferedImage(picture1.getWidth(), picture1.getHeight(),BufferedImage.TYPE_INT_RGB);  
     int width = picture1.getWidth(); 
     int height = picture1.getHeight(); 

//int kernel[][]={{-1,-1,-1},{-1,8,-1},{-1,-1,-1}};//for edge detection 
float kernel[][]={{0.111f,0.111f,0.111f},{0.111f,0.111f,0.111f},{0.111f,0.111f,0.111f}};//for blur 
//float kernel[][]={{0.111f,0.111f,0.111f,0.111f,0.111f},{0.111f,0.111f,0.111f,0.111f,0.111f},{0.111f,0.111f,0.111f,0.111f,0.111f},{0.111f,0.111f,0.111f,0.111f,0.111f},{0.111f,0.111f,0.111f,0.111f,0.111f}}; 
//int kernel[][]={{0,-1,0},{-1,5,-1},{0,-1,0}};//for sharpen 

for (int y = 0; y < height ; y++) {//loops for images 
for (int x = 0; x < width ; x++) { 

int r=0,g=0,b=0;//for kernel 
for(int i=0;i<3;i++){ 
for(int j=0;j<3;j++){ 
try 
{ 
Color c=new Color(picture1.getRGB(x+i-1,y+j-1));//x+i-1,y+j-1 will do exact what we want 
r+=c.getRed()*kernel[i][j]; 
b+=c.getBlue()*kernel[i][j]; 
g+=c.getGreen()*kernel[i][j]; 
}catch(Exception e){} 

} 
} 
r = Math.min(255, Math.max(0, r)); 
g = Math.min(255, Math.max(0, g)); 
b = Math.min(255, Math.max(0, b)); 
Color color = new Color(r, g, b); 
picture2.setRGB(x, y, color.getRGB()); 

} 
} 




ImageIO.write(picture2,"jpg",output);  
}catch(Exception e){ 
System.out.println(e); 
}}}