Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卷积模糊滤波器不';t工作并使图像变亮_Java_Image Processing - Fatal编程技术网

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,我在我的答案中添加了链接:“因为遮罩越大,像素数量就越多,并且定义了一个平滑过渡。”如果放大矩阵,也可以根据距离调整权重。-->类高斯滤波器