我想在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,
};
图片已删除。
答案 0 :(得分:3)
你的矩阵似乎错了。通常,这些矩阵中所有数字的总和为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]
,{{1}中获取源图像中的像素},[x-1][y+1]
,[x][y+1]
并将它们与滤镜值相乘(在您的情况下,每个都为0.111),将它们相加并将像素保存到新图像中。
请注意,您需要分别对每种颜色执行此操作(使用二进制AND操作和位移以获取每个颜色值)。您还需要考虑边缘,其中[x+1][y+1]
像素可能不存在。您可以替换值0或使用[x-1][y-1]
代替。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
该算法利用kernel实现了bufferedImage图像矩阵的转换。不同的内核可以用于不同的目的。
希望有所帮助
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);
}}}