Java 卷积模糊滤波器不';t工作并使图像变亮
我最近读到了卷积滤波器,并决定尝试一下。我想制作模糊图像的代码,但它最终做的是使图像变亮。我已经看了我的代码一段时间了,没有发现任何错误。有人能帮忙吗 这是我的密码:Java 卷积模糊滤波器不';t工作并使图像变亮,java,image-processing,Java,Image Processing,我最近读到了卷积滤波器,并决定尝试一下。我想制作模糊图像的代码,但它最终做的是使图像变亮。我已经看了我的代码一段时间了,没有发现任何错误。有人能帮忙吗 这是我的密码: final static int filterHeight =3; final static int filterWidth = 3; static double filter[][] = new double[][]{ {1,1,1}, {1,1,1}, {1,1,1} }; publ
final static int filterHeight =3;
final static int filterWidth = 3;
static double filter[][] = new double[][]{
{1,1,1},
{1,1,1},
{1,1,1}
};
public static void main(String[] args) {
BufferedImage img;
BufferedImage result;
try
{ File in = new File("in.jpg");
File out = new File("out.jpg");
img = ImageIO.read(in);
Color[][] pixels = new Color[img.getWidth()][img.getHeight()];
for(int i=0;i<img.getWidth();i++){
for(int j=0;j<img.getHeight();j++){
pixels[i][j]=new Color(img.getRGB(i,j),true);
}
}
result = new BufferedImage(img.getWidth(), img.getHeight(), img.getType());
for(int x=0;x<img.getWidth();x++){
for(int y=0;y<img.getHeight();y++){
int r=0,g=0,b=0;
for(int i=0;i<filterWidth;i++){
for(int j=0;j<filterHeight;j++){
int imageX = (int)(x - filterWidth / 2 + i + img.getWidth()) % img.getWidth();
int imageY = (int)(y - filterHeight / 2 + j + img.getHeight()) % img.getHeight();
if(imageX<0 || imageY<0) System.out.println("ERROR: "+imageX+" "+imageY);
r+=pixels[imageX][imageY].getRed()*filter[i][j];
g+=pixels[imageX][imageY].getGreen()*filter[i][j];
b+=pixels[imageX][imageY].getBlue()*filter[i][j];
}
if(r>255) r=255;
if(r<0) r=0;
if(g>255) g=255;
if(g<0) g=0;
if(b>255) b=255;
if(b<0) b=0;
Color color = new Color(img.getRGB(x,y),true)
Color colorBlur = new Color(r,g,b,color.getAlpha());
result.setRGB(x, y, colorBlur.getRGB());
}
}
}
ImageIO.write(result, "JPG", out );
}
catch (IOException e)
{
e.printStackTrace();
}
final static int filterHeight=3;
最终静态int filterWidth=3;
静态双过滤器[][]=新双过滤器[][]{
{1,1,1},
{1,1,1},
{1,1,1}
};
公共静态void main(字符串[]args){
缓冲图像img;
缓冲图像结果;
尝试
{File in=新文件(“in.jpg”);
File out=新文件(“out.jpg”);
img=图像IO.read(in);
颜色[][]像素=新颜色[img.getWidth()][img.getHeight()];
对于(int i=0;i有两个选项可以获得您想要的结果。
要么创建一个和为1的过滤器矩阵(如上面的评论中提到的@Spektre),要么将像素的新值乘以系数1/sum(filterMatrix)
对于模糊概念的入门教程,我推荐:
我认为您缺少一个除法因子的参数,该参数应该是滤波器矩阵的和,在您的情况下,9
。否则,您将进行9
像素的和,这很可能意味着>255
@Elia您应该添加它作为答案…更常见的是除法(标准化)矩阵本身,所以和是1,所以你不需要在每个像素上分割…所以我添加了这3行:r=r/9;g=g/9;b=b/9;
现在图像没有变亮,但我没有看到任何差异,没有模糊我把矩阵变大了,9x9,现在我可以看到一些模糊。所以矩阵越大,模糊越强?如果是这样的话,为什么我在每一篇教程中都会发现3x3矩阵的例子,但效果却不明显?@matip,我在我的答案中添加了链接:“因为遮罩越大,像素数量就越多,并且定义了一个平滑过渡。”如果放大矩阵,也可以根据距离调整权重。-->类高斯滤波器